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