2 whyyouhitme whyyouhitme_ 于 2018.02.05 16:00 提问

真是很奇怪。。代码明显不对,运行起来反而是对的。。。。

#include
#include
int main(void) //本程序按照“姓,名字首字母.”的格式将用户键入的英文名字输出
{
char first_name;
char ch_1;//名字
char ch_2;//姓氏

printf("Enter a first and last name:");
while((first_name=getchar())==' ')
;//获得名的首字母
while ((ch_1=getchar())!=toupper(ch_1))
;//获得名字
while ((ch_2 = getchar()) != '\n')//输出名字(排除空格)
{
if (ch_2 != ' ')
putchar(ch_2);
}
printf(", %c.\n", first_name);//输出结果

return 0;
}
初学,这是自己编的一段代码。因为只学到第六章循环,和第七章基本类型。所以只用已学过的东西来编。
第一个奇怪的是,第二个循环 while ((ch_1=getchar())!=toupper(ch_1));//获得名字
本意是想跳过所有小写字母,直到遇到大写字母停止的。但是经过运行,只要在名字和姓中间加空格,无论首字母是否小写,程序都能识别姓和名分别是哪个,并按题目要求正确显示。
第二个奇怪的地方,昨天也是这样,但怎么运行都不对,输出时,姓的大写首字母会丢掉,例如输入"Thierry Henry",输出则是"enry,T."我想也对。因为按书中所说,按照惯用法while(ch=getchar()==' ')是跳过无限个空格,但是程序终止时,ch会包含遇到的第一个非空格字符。由此推理while(ch_1=getchar()!=toupper(ch_1))的作用应该是跳过所有非大写字母,终止时,ch_1将包含第一个大写。所以后面输出ch_2的时候就丢掉了这个大写。
然而今天同样运行这个程序的时候,完全没毛病。

4个回答

beautyofmath
beautyofmath   2018.02.05 17:21
已采纳
  1. while ((ch_1=getchar())!=toupper(ch_1));语句是跳过所有的小写字母,但并不是遇到大写字母停止,而是遇到所有非小写字母停止. 当toupper()参数为非小写字母(包括数字,空格等特殊字符),该函数的返回均为该参数本身.楼主对toupper函数理解有些偏差;
  2. 当输入的姓和名之间无字符时,例如 "ThierryHerry"时,ch_1 ='H',因而putchar(ch_2),将会输出"erry" 楼主第二次运行没问题,我猜是因为输入是"Thierry Henry",姓和名之间加了空格,此时,ch_1 ='' (ch_1为空格),putchar(ch_2),将输出"Herry".并非是程序的问题,而是输入的改变. 望采纳.
beautyofmath
beautyofmath 回复whyyouhitme_: 回复whyyouhitme_: 把 while ((ch_1=getchar())!=toupper(ch_1)) ;//获得名字 这行代码替换成:while (isupper(ch_1=getchar())==0); putchar(ch_1); isupper()函数是判断一个字母是否是大写字母的函数,如果是大写,返回1,否则返回0,在得到名之后,别忘了把名的第一个字母输出,所以需 putchar(ch_1);这样有没有空格都不会影响了。
17 天之前 回复
whyyouhitme_
whyyouhitme_ 回复beautyofmath: 原来如此。明白了。题目的要求是用户可能在名前,名和姓之间,或姓后加若干空格(也就是说有可能不加),所以,有没有办法在不加空格的输入中区分姓和名?(不要吞掉姓的大写)。
17 天之前 回复
qq_41589986
qq_41589986   2018.02.05 16:42

#include
#include
int main(void) //本程序按照“姓,名字首字母.”的格式将用户键入的英文名字输出
{
char first_name;
char ch_1;//名字
char ch_2;//姓氏

printf("Enter a first and last name:");
while((first_name=getchar())==' ');//获得名的首字母
while ((ch_1=getchar())!=toupper(ch_1));//获得名字
/*********************/
printf("%d %d\n",' ',toupper(' '));
/*********************/
while ((ch_2 = getchar()) != '\n')//输出名字(排除空格)
{
    if (ch_2 != ' ')
        putchar(ch_2);
}
printf(", %c.\n", first_name);//输出结果

return 0;

}
//这个大概解决问题了,toupper ‘ ‘ 和 ’’得到的结果都是32(空格的ASCII值)所以第二个循环是没用了;
//在下也是现学现卖,如果有错误的地方还请指正

zhagoodwell
zhagoodwell   2018.02.06 08:47
zhagoodwell
zhagoodwell   2018.02.06 08:46
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!