【发布时间】:2020-01-23 16:57:32
【问题描述】:
#include <stdio.h>
#define MAX_STRING_LENGTH 1024
int main(){
char input_name_string[MAX_STRING_LENGTH+1],motive_string[MAX_STRING_LENGTH+1];
printf("What is your name?\n");
scanf("%1024s",input_name_string);
printf("your name is %s \n", input_name_string);
printf("What is your motive?\n");
scanf(" %1024s",motive_string);
printf("your motive is %s \n", motive_string);
return 0; }
所以我为学校的一个项目编写了这个简单的程序,以尝试了解 scanf 和 printf 的工作原理。由于某种原因,当它运行时,它会在一行上打印每个字符串中的第一个单词,然后在另一行上打印第二个单词。我不明白为什么会这样?我没有 C 方面的经验,但我的代码中的逻辑似乎是正确的?任何建议
【问题讨论】:
-
scanf永远不应该用于交互式输入。 -
@kaz 你所说的交互式输入是什么意思?
scanf解决了哪些具体用例? -
交互式输入是终端 - 您从键盘输入程序的所有内容。如果它是通过管道传输的,则将是非交互式的。例如
$ cat .profile | my_processing_prog。然后你可以使用 scanf() 作为cat标准输出是my_processing_prog标准输入。 -
@TruthSeeker
scanf用于扫描预先为机器准备的格式化输入。例如,在文件中准备的格式化数据,或来自其他程序。交互输入是指用户与程序交互。当输入不正确时,流将处于意外状态,很难以任何用户友好的方式从中恢复。特别是,任何与失败的scanf不匹配的多余字符都会留在流中并混淆后续的scanf调用。接受用户输入的程序必须更加宽容。 -
@TruthSeeker K&R2 的书说:"
scanf忽略其格式字符串中的空格和制表符。此外,它会跳过空格(空格、制表符、换行符等)它查找输入值。要读取格式不固定的输入,通常最好一次读取一行,然后用sscanf将其分开。"