whyyouhitme_ 2018-02-05 08:00 采纳率: 57.1%
浏览 944
已采纳

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

#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 2018-02-05 09: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".并非是程序的问题,而是输入的改变. 望采纳.
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流