1

我正在使用 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,因为该文件不应该存在?

我还应该补充一点,该代码存在于多线程程序中,但只有 1 个线程执行此代码。

4

1 回答 1

1
string[5];

您只为 4 个字符和一个空终止符分配了足够的空间,但您的 fgets 最多读取 100。

fgets(string, 100, fin);
于 2012-11-15T10:43:25.613 回答