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@mmm
    snprintf()
    之间的区别是什么?需要您提供目标字符串的大小,这样它就不会溢出。@mmm使用
    snprintf()
    是防止打印字符串过多问题的两个步骤之一。秒步骤是使用返回值
    int len=snprintf(....,size,…)
    -->
    if(len<0 | | len>=size)Handle_Problem()
    。如果没有第二步,后续代码可能会使用意外的字符串。考虑<代码> SNPRTNF(BUF,13,“%s”,“发射错误”);<代码>