C、 帮助,而循环继续,而不是真的

C、 帮助,而循环继续,而不是真的,c,C,任务: 写一个char do/while循环,如果字母不是大写,程序将在该循环中结束: 解决方案: Char input; do{ scanf("%c", &input); } while (input <'a' || 'z'< input); Char输入; 做{ scanf(“%c”,&input); }而(输入问题在于此语句: while (input <'a' || 'z'< input); 但是,最好使用头文件中的功能:ctype.h,因

任务: 写一个char do/while循环,如果字母不是大写,程序将在该循环中结束:

解决方案:

Char input;

do{
    scanf("%c", &input);

} while (input <'a' || 'z'< input);
Char输入;
做{
scanf(“%c”,&input);

}而(输入问题在于此语句:

while (input <'a' || 'z'< input);
但是,最好使用头文件中的功能:
ctype.h
,因为并非所有系统都使用ASCII字符集。(例如,IBM大型机使用EBCDIC而不是ASCII,其中字母表不连续)

请记住,“enter”键不是大写的(代码中不允许使用)

建议的守则如下:

  • 干净地编译
  • 执行所需的功能
  • 正确检查错误
  • 使用头文件
    ctype.h
  • 现在是拟议的守则

    #include <stdio.h>   // scanf(), perror()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    #include <ctype.h>   // isupper()
    
    
    int main( void )
    {
        // 'char' is all lower case: 
        // so this statement: Char input;
        // does not compile, suggest:
        char input;
    
        do
        {
            int scanfStatus = scanf("%c", &input);
            // always check the returned value (not the parameter value)
            if( 1 != scanfStatus )
            {
                perror( "scanf failed" );
                exit( EXIT_FAILURE );
            }
        } while ( isupper( input ) );
    } // end function: main
    
    #包括//scanf()、perror()
    #包括//退出(),退出失败
    #include//isupper()
    内部主(空)
    {
    //“char”全是小写:
    //所以这个语句是:Char输入;
    //不编译,建议:
    字符输入;
    做
    {
    int scanfStatus=scanf(“%c”,&input);
    //始终检查返回值(而不是参数值)
    如果(1!=扫描状态)
    {
    perror(“scanf失败”);
    退出(退出失败);
    }
    }while(isupper(input));
    }//结束函数:main
    
    您的问题是:

    为什么它控制从a到z的所有字母?如果它是一个小字符而不是大写字母,我的程序怎么会结束


    答案是,因为while测试,它测试
    input
    input<'a'| |'z'
    是否等于“输入是a或z”..
    Char
    不是标准类型。您是否有
    typedef
    ?请注意,您需要为此类问题提供答案。提示:查看
    ctype.h
    。或者只需执行
    man isupper
    。您需要
    while(输入='a'|输入='z'))
    而不是测试整个范围。解决方案是我书中的facit。在visual studio中,它只接受带有此代码的大写字母。我不明白为什么。@user3629249,我现在可以评论你的帖子了,因为我赢得了一点声誉。你的代码不会“干净地”编译使用
    gcc-Wall
    ,因为您没有以
    return 0;
    结束它。我4天前建议的编辑被拒绝(最初被审阅者接受,后来被您拒绝)。编译中的警告不是一个干净的编译,IMHO。否则,你的回答包含了好的代码和准确的解释,但我不确定它是否回答了OP的问题。他没有要求修改他的代码。他说,作为C新手,他需要解释为什么他的代码会以他所描述的方式运行。@Tardis,关于如果唯一的返回值始终为0,那么现代C编译器不需要该语句。我发布的所有代码都是用gcc-ggdb-C-Wall-Wextra-pedantic-Wconversion-std=gnu11干净地编译的。我只是再次通过编译器运行了它。没有警告,什么都没有。我同意我可能没有清楚地解释解释了代码失败的原因。Re:
    返回0;
    。今天的Debian使用GCC v4.9.2,它与
    GCC-Wall
    ,表示
    警告:控件到达非无效函数的末尾[-Wreturn type]
    。这是因为GCC 4默认为
    -std=gnu90
    (带有GNU扩展的c90).Ubuntu的股票GCC是v4,Windows代码块MinGW下也是如此。GCC 5将其默认值更改为
    -std=gnu99
    ,但2017年使用GCC尝试代码的大多数人不会使用它,也不会指定
    -std=
    选项。发布代码时,我更喜欢以最便携的方式(没有GNU扩展的c90),特别是如果我声称我的代码“干净地编译”:-)Re:OP的代码和问题。OP的问题不清楚,他的代码不完美,但他的代码并没有失败,在用户按下带有小写字母的键(并按下enter键)后,它确实会退出循环,事实上,他并没有抱怨代码失败(他甚至不知道他的代码不完美)。他只是不明白while测试在做什么或者它是如何工作的。
    #include <stdio.h>   // scanf(), perror()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    #include <ctype.h>   // isupper()
    
    
    int main( void )
    {
        // 'char' is all lower case: 
        // so this statement: Char input;
        // does not compile, suggest:
        char input;
    
        do
        {
            int scanfStatus = scanf("%c", &input);
            // always check the returned value (not the parameter value)
            if( 1 != scanfStatus )
            {
                perror( "scanf failed" );
                exit( EXIT_FAILURE );
            }
        } while ( isupper( input ) );
    } // end function: main