有人可以帮我解决我的错误......
发生了什么:
我的程序叫“打开”
继续我的输出:
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]);
答案 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]);
无效。
使用snprinf()
,其中源和目的地重叠是UB。
sizeof(av[2])
是指针的大小,在这种情况下为8,而不是数组的大小。
很可能av[2]
的大小不足以保存连接。