C:scanf无法正常工作

时间:2016-04-26 17:12:52

标签: c scanf

我希望程序控制用户的输入(必须是字母/字母),但如果我把" xx"它走出了循环,为什么?

        char c;
        int i = 0;
        do{
            if(i!=0){
                printf("Wrong!\n");
            }
            printf("Insert char: ");
            scanf(" %c", &c);
            i++;
        }while(c<'a' && c>'z' && c<'A' && c>'Z');

- - - - &GT;编辑/正确

这段代码应该从键盘上读取一个字符(必须是一个字母,无论是小写还是小写),如果不是这样,我会写#34;错误&#34;。 / p>

正如你告诉我的那样我纠正了do / while的条件,现在代码是:

            do{
                if(i!=0){
                    printf("Wrong!\n");
                }
                printf("Insert char: ");
                scanf(" %c", &c);
                i++;
            }while(!((c>='a' && c<='z') || (c>='A' && c<='Z')));

输入示例:

我的期望

  • &#39;一个&#39; - &GT;退出循环
  • &#39; AA&#39; - &GT;留在循环中
  • &#39;&#39; - &GT;留在循环中
  • &#39; ..&#39; - &GT;留在循环中

会发生什么

  • &#39;一个&#39; - &GT;退出循环
  • &#39; AA&#39; - &GT;退出循环
  • &#39;&#39; - &GT;留在循环中
  • &#39; ..&#39; - &GT;留在循环中(但它打印了两次&#34;错误&#34;)

如果我没有在scanf中放置空格,那么(&#34;%c&#34;),程序会自动打印我&#34;错误&#34;和&#34;插入char&#34; (它只是循环)

(如果我之前没有很好地解释过这个问题,请向我道歉)

4 个答案:

答案 0 :(得分:3)

您的条件

while(c<'a' && c>'z' && c<'A' && c>'Z');

永远不会成真。

  

但如果我把“xx”放到循环中,为什​​么?

由于do-while是退出条件循环,因此您第一次进入循环是唯一的时间。

答案 1 :(得分:1)

说明符%c表示。因此,您的while循环会检查单个字符,但您会将作为输入。

如果您想输入string,请将scanf声明更改为:

scanf("%s", &s);

作为说明符%c表示string。您需要相应地修改while循环,以便您的条件在某个时刻变为true

答案 2 :(得分:1)

while(c<'a' && c>'z' && c<'A' && c>'Z')

总是假的,这就是原因。

如果是真的:

if(i!=0){ printf("Wrong!\n");}

将始终打印为false(第一次除外)。

我不确切地知道你想要什么。

答案 3 :(得分:0)

你的问题是在这种情况下,它总是错误的。

示例代码:

#include <cstdio>
#include <cctype>

int main ()
{
    char c;
    do scanf("%c", &c);
    while(tolower(c)<'a' || tolower(c)>'z');
    printf("%c\n",c);
    return 0;
}