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/