C、 帮助,而循环继续,而不是真的
任务: 写一个char do/while循环,如果字母不是大写,程序将在该循环中结束: 解决方案: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 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测试,它测试inputinput<'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