strncat():目标字符串中的随机字符
strncat(): Random character in target string
考虑以下程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int ret = 0;
char dirname[] = "test/";
int path_maxlen = 256;
char path[path_maxlen];
int filename_maxlen = path_maxlen - strlen(dirname);
strncat(path, dirname, path_maxlen - 1);
strncat(path, "file.txt", filename_maxlen);
FILE *file = fopen(path, "r");
printf("path: %s\n", path);
if (file != NULL) {
printf("success\n");
fclose(file);
} else {
printf("fail\n");
ret = 1;
}
return ret;
}
这似乎一开始有效,但后来开始失败,即文件无法打开,尽管它存在并且没有对程序或文件进行任何更改。
那时我添加了打印出 path
的行。将输出重定向到文件后,发现 path
前面有一个随机字符(ASCII:1 SOH 'start of heading')。所以我假设 strncat
在这里没有正确使用,并且一些随机垃圾被写入我的路径数组。
如何正确连接上例中的字符串?
PS: 我的 OS 是 Ubuntu 16.04。编译器是:
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
strncat(path, dirname, path_maxlen - 1);
path
未初始化,因此是未定义的行为。
尝试
char path[path_maxlen];
path[0] = 0; // since path is VLA, usual "={0}" initialization does not work
或者您可以考虑只使用 strcpy_s
。
考虑以下程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int ret = 0;
char dirname[] = "test/";
int path_maxlen = 256;
char path[path_maxlen];
int filename_maxlen = path_maxlen - strlen(dirname);
strncat(path, dirname, path_maxlen - 1);
strncat(path, "file.txt", filename_maxlen);
FILE *file = fopen(path, "r");
printf("path: %s\n", path);
if (file != NULL) {
printf("success\n");
fclose(file);
} else {
printf("fail\n");
ret = 1;
}
return ret;
}
这似乎一开始有效,但后来开始失败,即文件无法打开,尽管它存在并且没有对程序或文件进行任何更改。
那时我添加了打印出 path
的行。将输出重定向到文件后,发现 path
前面有一个随机字符(ASCII:1 SOH 'start of heading')。所以我假设 strncat
在这里没有正确使用,并且一些随机垃圾被写入我的路径数组。
如何正确连接上例中的字符串?
PS: 我的 OS 是 Ubuntu 16.04。编译器是:
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
strncat(path, dirname, path_maxlen - 1);
path
未初始化,因此是未定义的行为。
尝试
char path[path_maxlen];
path[0] = 0; // since path is VLA, usual "={0}" initialization does not work
或者您可以考虑只使用 strcpy_s
。