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

时间:2017-06-10 13:19:57

标签: c

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

解决方案:

Char input;

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

} while (input <'a' || 'z'< input);

所以我的程序说:&#34;这样做,而输入是a或z&#34;。为什么它控制从a到z的所有字母?如果它是一个小字符而不是资本,我的程序怎么结束?

我是C的新手,我无法在任何地方找到解释,提前感谢。

2 个答案:

答案 0 :(得分:1)

问题在于这句话:

while (input <'a' || 'z'< input);

因为这是寻找任何不是小写字母而不考虑整个ascii(单一字符)可能性表。

标准是upper case,这些字母是小写的。

你可以使用:

while ('A' <= input && input <= 'Z')

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

请记住,'enter'键不是大写的,(代码中不允许)

以下提议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查错误
  4. 使用标头文件ctype.h
  5. 中定义的工具

    现在提出的代码

    #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
    

答案 1 :(得分:0)

你的问题是:

  

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

答案是,因为while测试,测试是input <'a'还是'z'< input

以下是一些背景信息,可帮助您了解发生这种情况的原因。

在你的程序中,输入是char,根据C标准,char类型是一个整数类型。这意味着'a'(C指定char字面的方式)实际上是一个数字,因此,它可以与比较运算符(如<或{{1)进行比较其他(整数)数字或其他>(此处为char的内容)。

现在,input的实际整数值是多少?虽然字符集的整数值是实现定义的,但一般来说,C编译器(ASCII Character Codes Chart 1 from MSDN)将使用ASCII字符代码。

所以:

    您的代码中的
  • char是指'a' char的ASCII代码的整数值,即97,
  • 代码中的
  • 'a'是指'z' char的ASCII代码的整数值,即122

正如您在ASCII表({{3}})中看到的那样,字母az具有连续的代码编号('z'为97,'a'为98等),以及小写字母实际上是从97到122的ASCII码。

因此,在您的代码中,测试'b'input <'a'等同于'z'< inputinput < 96,输入122 < input时也是如此具有超出96 - 122范围内的任何ASCII值,这意味着,输入的任何字符不在“a”到“z”的小写字母的ASCII代码范围内,将导致while测试为真,并重复char

最后,正如其他评论员或贡献者所指出的那样,正确的类型是scanf(),而不是char,因为C区分大小写。