gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:55:40 25 4
gpt4 key购买 nike

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

#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。如果有人能阐明这个问题,我将永远感激不已。

谢谢!!

最佳答案

你不能那样做

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()的返回值,在如果没有足够的空间将所有源字符串写入目标,它将被截断,如果 snprintf() 返回大于或等于请求的最大值的值,则意味着字符串被截断, 所以一个简单的检查就像

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

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

注意:正如chux 再次指出的那样,snprintf() 将在出现错误时返回负值,您可以检查一下分别检查是否有错误。

关于c - 使用 sprintf() 将整数保存到字符串数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28050704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com