使用sprintf()将整数保存到字符串数组中

时间:2015-01-20 16:43:48

标签: c integer argv

我无法使用sprintf()将整数存储到字符串数组中。我正在尝试创建一个新的argv列表以传递到我的子进程。我有一个' curr'自从我在GDB中测试以来存储了正确的值。我的代码如下:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h> /* for pid_t */

int main(int argc, char *argv[]){

static char *argv2[] = {"./datagen", "10", "outputfile", "SIGUSR1"};

pid_t pid = fork();
int curr = getpid();
sprintf(argv2[4], "%s", curr);


if(pid == 0)
{
    printf("You are in the child process.\n");

}
else{
    printf("You are in the parent process.  Process ID is %d\n", getpid());
}


return;
}

在彻底搜索一个明确的答案之后,我还没有找到任何东西。理想情况下,argv2的第4个插槽会将进程ID存储为字符串。但是,我遇到了分段错误11.如果有人能够对这个问题有所了解,我会永远感激。

谢谢!

4 个答案:

答案 0 :(得分:4)

你不能这样做

static char *argv2[] = {"./datagen", "10", "outputfile", "SIGUSR1"};

是一个char指针数组的声明,它指向字符串文字,而且只指向四个字符串文字,你不能扩展它,也不能修改字符串。

您需要的是

char argv2[10][100] = {"./datagen", "10", "outputfile", "SIGUSR1"};

假设您希望10字符串的最大长度为100,您可以明显更改。

此外,整数的格式说明符是"%d"所以你有另一个错误,已经说了所有你现在可以

sprintf(argv2[4], "%d", curr);

我建议使用snprintf()函数,因为它可以避免缓冲区溢出问题,

snprintf(argv2[4], sizeof(argv[4]), "%d", curr);

chux 评论是正确的,如果你想控制字符串的指定长度是否足够,你应该检查snprintf()的返回值,如果没有&#39 ; t足够的空间将所有源字符串写入目标它将被截断,如果snprintf()返回的值大于或等于请求的最大值,则表示该字符串被截断,因此需要进行简单的检查,如

if (snprintf(argv2[4], sizeof(argv[4]), "%d", curr) >= sizeof(argv[4]))
    doSomething_TheString_Was_Truncated();

虽然100字符和"%d"不会发生,但我坚信人们必须将安全代码作为一种习惯,而不是只检查可能的问题,检查每一件事无论多么不可能,概念上都可能出错。因为有时候会出现意想不到的事情。

注意:再次指出 chux snprintf()会在出现错误时返回否定,您可以单独检查,检查是否有一个错误。

答案 1 :(得分:1)

简单步骤:
1) 确定现有argvargc参数的数组大小信息。

int i, len=0, lenKeep=21;//initialize large enough to contain pid integer
for(i=0;i<argc;i++)
{
    len = strlen(argv[i])
    if(lenKeep<len)lenKeep = len;
}  

2) 使用该大小信息创建新的字符串数组argv2,并在必要时添加其他元素。 (argv2将是一个字符串数组,创建足够的空间。)

char argv2[argc+1][lenKeep+1];    
//argc+1 allows for additional array element
//lenKeep+1 provides space for all existing content  

3) 以正常方式向字符串数组添加新信息。

sprintf(argv2[argc], "%d", curr); //argv2 array contains argc + 1 elements 
                                  //so now argc is a valid index value

答案 2 :(得分:0)

sprintf(argv2[4], "%s", curr);打破了只有4个元素的数组。

即使它有更多的元素,你也要写一个字符串文字,即未定义的行为。

答案 3 :(得分:0)

尝试使用%d而不是%s,它应该保存为C字符串。