我无法使用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.如果有人能够对这个问题有所了解,我会永远感激。
谢谢!
答案 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) 确定现有argv
,argc
参数的数组大小信息。
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字符串。