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

为什么我不能使用C打印此文件中的整个消息?,c,C,在这里,我创建了一个名为message的数组,在收到用户的输入后,我将存储的字符串打印到名为'file.txt'的文件中,但结果表明,只有消息数组的第一个字在文件中打印。 例如:如果我在消息数组中键入“Hello here,我正在学习C”并将其打印到文件中,那么文件上只打印“Hello”。 请详细解释。请勿在没有最大字段宽度的scanf中使用%s,否则很可能会导致缓冲区溢出。使用%s并不比使用获取更好 您遇到的问题只是%s读取到第一个空格。如果要使用所有输入,可能应该使用fread而不是scan

在这里,我创建了一个名为message的数组,在收到用户的输入后,我将存储的字符串打印到名为'file.txt'的文件中,但结果表明,只有消息数组的第一个字在文件中打印。 例如:如果我在消息数组中键入“Hello here,我正在学习C”并将其打印到文件中,那么文件上只打印“Hello”。 请详细解释。

请勿在没有最大字段宽度的scanf中使用
%s
,否则很可能会导致缓冲区溢出。使用
%s
并不比使用
获取
更好

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

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);
如果只想读取一行文本,可以使用
fgets
。如果要使用scanf仅读取一行,可以执行以下操作:
scanf(“%499[^\n]”,message)
(请注意,这与
%499s
有很大不同,因为它不会丢弃前导空格,只在第一个换行符而不是第一个空格字符处停止。)如果要使用
scanf
读取整个输入流,可以尝试类似
scanf(“%499[^\1]”,message)的方法这可能足以进行文本输入


无论使用什么输入法,请确保检查返回值。如果
scanf
未能分配输入项(例如,因为输入与格式字符串不匹配),则读取该项可能会调用未定义的行为。如果
fread
返回0,或(在本例中)499,则需要添加逻辑以决定要执行的操作。

scanf
在第一个空格处停止。只需放置一个
printf(“message=%s\n”,message)在扫描之后,您将看到。使用
fgets
而不是
scanf
。如果消息包含%,则您的代码将失败,因为没有格式。在您的问题中,您会提示用户输入“不超过500字”。但是,您的程序最多只能存储500个字符,而不能存储单词。如果不计算终止的空字符,它实际上是499个字符。为什么
fread()
而不是
fgets()
?@JonathanLeffler,因为OP似乎试图消耗所有输入,而不是一行。
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';