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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)