strcpy没有复制完整的字符串

时间:2012-11-15 10:39:30

标签: string visual-c++ strcpy

我正在使用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 个答案:

答案 0 :(得分:1)

string[5];

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

fgets(string, 100, fin);