【问题标题】:strcpy not copying the full stringstrcpy 没有复制完整的字符串
【发布时间】:2012-11-15 10:39:29
【问题描述】:

我使用的是 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”应该存储在“字符串”变量中。

但是,对于大约 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个线程执行这段代码。

【问题讨论】:

  • 如果你在使用 C++,为什么你还在使用 char []FILE 而不是 std::string 和流?
  • 我比较熟悉 char[] 和 FILE。这会有所作为吗?
  • 是的,它会的。 std::string 与大多数其他 std 容器一样,会自动扩展以包含您放入其中的所有数据,从而使您不必手动跟踪长度和内存分配。

标签: string visual-c++ strcpy


【解决方案1】:
string[5];

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

fgets(string, 100, fin);

【讨论】:

  • 是的,但 fgets 不会也读取到文件在“1”之后的 \n。无论如何,这条线出现在 strcpy 之后,我认为这是我为“字符串”获得的垃圾值的主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2020-02-17
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多