c - 为什么我不能使用 C 打印此文件中的整个消息?

标签 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”打印在文件上。 请详细解释一下。

最佳答案

切勿在没有最大字段宽度的情况下在 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,您将需要添加逻辑来决定要做什么。

关于c - 为什么我不能使用 C 打印此文件中的整个消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66009291/

相关文章:

C - 如何将数据类型 'int' 从主机转换为网络

c - 如何写一个好的和高效的makefile

c++ - "Detects zero bytes inside a 32 bit integer"这个代码有什么用?

c - 如何以表格格式将字符串列表打印到文件中?

c++ - C/C++ : How to store data in a file in B tree

c - Makefiles - ar : *. a : No such file or directory. ...但是有...它就在那里

c - 在链表中排序插入程序

c - 在 ELF 文件中读取 .dynstr (strtab) 时出现段错误

c++ - 两次调用timer_settime会产生错误

c++ - 无效的静态断言行为