首页 > 解决方案 > 为什么我不能使用 C 打印此文件中的整个消息?

问题描述

char message[500];
printf("\nEnter your message (Not more than 500 words)\n->");
scanf("%s", message);

FILE *ptr;
ptr = fopen("file.txt", "w");

fprintf(ptr, message);
fclose(ptr);

在这里,我创建了一个名为 message 的数组,在接收到用户的输入后,我将存储的字符串打印到名为 'file.txt' 的文件中,但事实证明只有消息数组的第一个单词在文件中打印。例如:如果我在消息数组中输入“Hello there, I am learning C”并将其打印到文件中,那么文件上只会打印“hello”。请详细解释。

标签: c

解决方案


切勿在没有最大字段宽度的情况下在 scanf 中使用%s,否则您很可能会溢出缓冲区。使用%s并不比gets.

您遇到的问题只是%s读取到第一个空格。如果您想使用所有输入,您可能应该使用fread而不是scanf. 那是:

char message[500];
printf("\nEnter your message (Not more than 500 characters)\n->");
size_t s = fread(message, 1, sizeof message - 1, stdin);
message[s] = '\0';

如果您只想阅读一行文本,可以使用fgets. 如果您想使用 scanf 仅读取一行,您可以这样做:(scanf("%499[^\n]", message);请注意,这与%499s它不会丢弃前导空格,并且仅在第一个换行符而不是第一个空格字符处停止。)如果你想用来scanf读取整个输入流,你可以尝试类似的东西scanf("%499[^\1]", message);,这可能足以用于文本输入。

无论您使用哪种输入法,请务必检查返回值。如果scanf未能分配输入项(例如,因为输入与格式字符串不匹配),则读取该项可能会调用未定义的行为。如果fread返回 0 或(在这种情况下)499,您将需要添加逻辑来决定要做什么。


推荐阅读