Snprintf无法在C中工作

时间:2017-04-28 15:49:47

标签: c linux printf

有人可以帮我解决我的错误......

发生了什么:

我的程序叫“打开”

继续我的输出:

user@host:~$ ./open open A
A
open
Error: Cannot creat ./././.: Is a directory
./././.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]);

2 个答案:

答案 0 :(得分:4)

第一个问题是av[2]是指针,因此sizeof(av[2])是指针的大小,而不是数组中的字符数。

第二个问题是如果这是程序的argv[]数组,每个元素只有实际参数的空间 - 你不应该尝试将更长的字符串存储到其中。 / p>

解决方案是分配一个足够大的新字符串

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(),因为我们计算path的大小足以进行连接。

答案 1 :(得分:4)

由于各种原因,

snprintf(av[2], sizeof(av[2]), "./%s/%s", av[2], av[1]);无效。

  1. 使用snprinf(),其中源和目的地重叠是UB。

  2. sizeof(av[2])是指针的大小,在这种情况下为8,而不是数组的大小。

  3. 很可能av[2]的大小不足以保存连接。