用scanf切换一个输入

时间:2014-10-17 23:41:51

标签: c

我想问一下,如果有人可以帮我解决我的代码中存在的问题。我的意思是,虽然我想要scanf 2变量,代码想要一个更多的输入.. dunno什么是错的.. 顺便说一句:我添加部分代码

enter image description here

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;

1 个答案:

答案 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