Snprintf在C中不工作
有人能帮我解决我的错误吗 发生的情况如下: 我的程序叫“开放” 这是我的输出:Snprintf在C中不工作,c,linux,printf,C,Linux,Printf,有人能帮我解决我的错误吗 发生的情况如下: 我的程序叫“开放” 这是我的输出: user@host:~$/打开一个 A. 打开 错误:无法创建。/。/。/:是一个目录 ./././.user@host:~$ 为什么输出结果是/而不是/A/open 我知道问题来自av[2] printf("%s\n", av[2]); printf("%s\n", av[1]); snprintf(av[2], sizeof(av[2]), "./%s/%s", av[2], av[1]); printf("%
user@host:~$/打开一个
A.
打开
错误:无法创建。/。/。/:是一个目录
./././.user@host:~$
为什么输出结果是/
而不是/A/open
我知道问题来自av[2]
printf("%s\n", av[2]);
printf("%s\n", av[1]);
snprintf(av[2], sizeof(av[2]), "./%s/%s", av[2], av[1]);
printf("%s", av[2]);
第一个问题是
av[2]
是指针,因此sizeof(av[2])
是指针的大小,而不是数组中的字符数
第二个问题是,如果这是程序的argv[]
数组,则每个元素只能容纳实际参数——您不应该尝试在其中存储更长的字符串
解决方案是分配一个足够大的新字符串来满足您的需要
size_t newlen = strlen(av[1]) + strlen(av[2]) + 4; // + 3 for ./ and /, +1 for trailing null
char *path = malloc(newlen);
if (!path) {
printf("Unable to allocate\n");
exit(1);
}
sprintf(path, "./%s/%s", av[2], av[1]);
printf("%s", path);
在这种情况下,没有必要使用snprintf()
,因为我们计算了路径的大小,以便足以进行连接。snprintf(av[2],sizeof(av[2]),“/%s/%s”,av[2],av[1])代码>因各种原因无效
在源和目标重叠的地方使用snprinf()
sizeof(av[2])
是指针的大小,在本例中为8,而不是数组的大小
很可能av[2]
的大小不足以保存串联
sizeof(av[2])
是指针的大小,可能是4个字节。所以我必须将其更改为其他值?我试图删除它,但结果是分段错误。为什么要将结果存储到av[2]
?除了已经包含的字符外,它可能没有空间容纳任何额外字符。请显示更多代码。什么是av
?。阅读:程序参数的常用名称是argv[]
。使用您自己的名称会使问题混淆。是的,它是argv[]数组。谢谢你的解释。了解了有关CI的更多信息,现在获取大小部分,但是snprinf和sprintf@mmmsnprintf()
之间的区别是什么?需要您提供目标字符串的大小,这样它就不会溢出。@mmm使用snprintf()
是防止打印字符串过多问题的两个步骤之一。秒步骤是使用返回值int len=snprintf(....,size,…)
-->if(len<0 | | len>=size)Handle_Problem()
。如果没有第二步,后续代码可能会使用意外的字符串。考虑<代码> SNPRTNF(BUF,13,“%s”,“发射错误”);<代码>