我想问一下,如果有人可以帮我解决我的代码中存在的问题。我的意思是,虽然我想要scanf 2变量,代码想要一个更多的输入.. dunno什么是错的.. 顺便说一句:我添加部分代码
for(i;i<4;i++){
switch(i){
case 0:{
printf("Bod #1:\n");
scanf("%d%d\n",&x1,&y1);
printf("x1=%d y1=%d\n",x1,y1);
printf("working 1\n");
}
break;
答案 0 :(得分:1)
你的问题在于这一行:
scanf ("%d%d\n", &x1, &y1);
格式字符串中的\n
。引用标准(C11 7.21.6.2 The fscanf function /5
并记住\n
是一个空白字符:
由空白字符组成的指令通过读取输入直到第一个非空白字符(仍未读取)或直到不再读取任何字符来执行。该指令永远不会失败。
因此,根据问题中的输入值,scanf
开始处理格式字符串"%d%d\n"
。
第一个格式说明符%d
需要更多输入,当你输入45\n
时,它会跳过任何空格(其中没有空格)并将整数加载到其变量中,留下{{ 1}}和输入流因此(x1 == 45
表示下一个读取点):
^
第二个格式说明符45\n
^
会跳过空格(%d
),然后需要更多数据,因此您输入\n
。然后它将该整数加载到其变量中,留下459\n
和输入流:
y1 == 459
这是您的问题开始的地方。 final 格式说明符45\n459\n
^
需要读取但不包括第一个非空格字符。但它不能告诉此时存在非空白字符(因为您可能会输入更多的空格),所以它还需要您提供的更多输入:{{ 1}}。这将输入流保留为:
\n
现在,54\n
格式说明符知道45\n459\n54\n
^
中的\n
是第一个非空格字符,它在读取之前就会停止,给出:
5
那是 54
返回的点,因为所有格式说明符都已满足。当然,对45\n459\n54\n
^
的下一次调用在输入流中已经有scanf()
,因此将用于填充scanf("%d%d...")
。在54\n
返回之前,你仍然 还要输入两个值,第一个将填充x1
,第二个将满足scanf()
说明符
现在,如何解决它。嗯,这很容易。如上所述,y1
(和大多数其他格式字符串)在尝试读取数据之前会跳过空格。
这意味着如果您只使用\n
作为格式字符串而不使用问题%d
,则系统会自动忽略换行符。
请参阅以下代码:
"%d%d"
和样本运行:
\n