0

我想我已经尝试过任何东西(刷新标准输入、scanf 以使用换行符等),但没有任何效果像我希望的那样。出于某种原因,第 3 次 scanf 在以下代码中修改了第 2 次 scanf 中的变量:

#include <stdio.h>

int main()
{
  char first_name[16], last_name[21];
  char filename[11];
  FILE *opening;

  printf("The program saves your first and last name into a file.\n");

  printf("Enter your first name:");
  scanf("%s", first_name);
  getchar();

  printf("Enter your last name:");
  scanf(" %s", last_name);
  getchar();

  printf("File where you want to save your name:");
  scanf(" %s", filename);

  opening = fopen(filename, "wb");

  fprintf(opening, "%s %s", first_name, last_name);
  printf("\nSuccessfully saved the data!");

  fclose(opening);

  return 0;
}

输出:

The program saves your first and last name into a file.
Enter your first name: John
Enter your last name: Doe
File where you want to save your name: filename.txt

Successfully saved the data!

一切都很好,除了 filename.txt 的内容是这样的:

约翰吨

我猜't'字符不知何故来自'txt',但我刚刚开始学习C,我不知道如何修复这段代码才能工作。请问各位高手能帮帮我吗?

4

3 回答 3

1

你的filename缓冲区太小了。

你写filename.txt的是 12 个字符,加上完成它的零,得到 13。你只分配 11。试试这样:

char filename[20];

它应该可以工作。

使用时要小心scanf,它可能会导致非常讨厌的问题,就像您现在遇到的那样。它在实验和学习 C 方面很有用,因为它向您展示了正确的内存处理是多么重要。对于任何实际项目,您应该考虑使用不同的功能或框架。

于 2013-09-16T15:29:49.780 回答
0

如果您输入 filename.txt 作为文件名,那么您将超出filename. 这是未定义的行为,是导致奇怪结果的原因。

要修复,char filename[11];请放大,记住为 NULL 终止符允许 1 个额外字符。在您非常具体的情况下,这将char filename[14];允许%s在您的scanf通话之前有错误的空间。

否则,一切看起来都很好。

于 2013-09-16T15:29:14.300 回答
0

在字符串上使用scanf()是危险的,因为它可能会将更多的数据读入缓冲区,而不是缓冲区提供的内存

如果在字符串中扫描,则应始终scanf()通过将此数字添加到传递给的格式来告诉要读取多少字符scanf()

char file_name[11];

...

scanf("%10s", file_name); /* As file_name provides memor for 11 characters, read a
                             maximum of 10 characters into file_name leaving 1 
                             character room for the necessary `0-`terminator indicating 
                             the end of the "string". */

您的代码也错过了对fopen系统调用的错误检查。

最好做这样的事情:

opening = fopen(filename, "wb");
if (NULL == opening)
{
  perror("fopen() failed");
  exit(EXIT_FAILURE);
}
于 2013-09-16T15:30:28.810 回答