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 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题