我正在使用Visual C ++ 6.0,我有以下代码。
char filename[1000], string[5];
FILE *fin;
strcpy(filename, argv[3]);
if ((fin = fopen(filename, "r")) != NULL)
{
fgets(string, 100, fin);
string[strlen(string)-1] = NULL;
printf("filename = %s\n", filename);
printf("argv[3]= %s\n", argv[3]);
printf("string = %s\n", string);
}
argv [3]是完整路径和文件名,例如C:\ Users \ Desktop \ file.txt,文件内容为
1
2
3
所以“1”应该存储在“string”变量中。
但是,对于4次运行中的大约1次,我会得到输出
filename = C:\Users\Desktop\file.tx
argv[3] = C:\Users\Desktop\file.txt
string = <very long garbage value>
为什么
strcpy(filename, argv[3]);
不复制整个字符串,错过最后一个“t”?为什么在这种情况下fin不是NULL,因为文件不应该存在?
我还应该补充说,这个代码存在于一个多线程程序中,但只有一个线程执行此代码。
答案 0 :(得分:1)
string[5];
您只为4个字符和空终结符分配了足够的空间,但您的fgets最多可读取100个。
fgets(string, 100, fin);