任务: 写一个char do / while循环,如果字母不是大写,程序将结束:
解决方案:
Char input;
do{
scanf("%c", &input);
} while (input <'a' || 'z'< input);
所以我的程序说:&#34;这样做,而输入是a或z&#34;。为什么它控制从a到z的所有字母?如果它是一个小字符而不是资本,我的程序怎么结束?
我是C的新手,我无法在任何地方找到解释,提前感谢。
答案 0 :(得分:1)
问题在于这句话:
while (input <'a' || 'z'< input);
因为这是寻找任何不是小写字母而不考虑整个ascii(单一字符)可能性表。
标准是upper case
,这些字母是小写的。
你可以使用:
while ('A' <= input && input <= 'Z')
但是,最好使用头文件中的功能: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
答案 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'< input
或input < 96
,输入122 < input
时也是如此具有超出96 - 122范围内的任何ASCII值,这意味着,输入的任何字符不在“a”到“z”的小写字母的ASCII代码范围内,将导致while测试为真,并重复char
。
最后,正如其他评论员或贡献者所指出的那样,正确的类型是scanf()
,而不是char
,因为C区分大小写。