鱼C论坛

 找回密码
 立即注册
查看: 1821|回复: 9

[已解决]关于while语句的问题

[复制链接]
发表于 2018-12-15 23:00:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下 :
  
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         int ch;
  5.         printf("请输入一行英文句子:");

  6.         while ((ch=getchar()) != '\n')
  7.         {
  8.                 if ('A' <= ch && 'Z' >= ch)
  9.                 {
  10.                         ch = ch-'A' +'a';
  11.                 }
  12.                 else if(ch>='a'&&ch<='z')
  13.                 {
  14.                         ch = ch - 'a'+'A';
  15.                 }
  16.                 putchar(ch);
  17.         }
  18.         putchar('\n');
  19.         return 0;
  20. }
复制代码


要是把'\n'换成是'\0' 那么我的代码就一直处在转换后的等待状态  结束不了(我知道'\0'是一个字符串的结束符)  我输入'\0' 也没有结束循环  求解


最佳答案
2018-12-15 23:39:37
我也不清楚是否理解你的提问了。按照我对你的问题理解说一下个人看法。你所说的把'\n'换成'\0',是想把while循环的条件中的'\n'换成'\0'吗?那样是肯定不行的。

首先需要了解getchar(),它是从标准输入里读取一个字符,标准输入一般理解是键盘能输入的字符,这和ASCII表并不完全对应,例如ASCII表中回车换行是两个字符(ASCII码分别是13和10),在标准输入中是一个键。
然后再来理解'\n'和'\0','\0'是C语言中字符串的结束字符,在ASCII码中是0,即NULL,但是并不是标准输入的字符;'\n'是回车换行字符,是能够使用标准输入进行输入的字符。
最后看看程序的执行,你是无法使用标准输入来输入'\0'的,因此若用'\0'作为while循环判断也就无法结束循环。'\n'能够被getchar捕获,因此将之作为while循环结束的判断条件是可以结束while循环的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-15 23:03:59 | 显示全部楼层
要是觉得我描述的不清楚,麻烦您复制粘贴到编译器看一下('\n'换成是'\0' )  谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-15 23:05:54 | 显示全部楼层
getchar()
又 putchar() 你打算什么时候结束?

好比你一个箱子,从里面取东西取来。然后又放进去,你觉得你的箱子空的了吗?

先把你的题意说清楚吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-15 23:14:40 | 显示全部楼层
'\0' 属于不可见字符
可以按下Alt键然后按小键盘上面的数字0键,一定是小键盘上面的0
可以通过按Alt+小键盘上的数字来输入字符的ASCII
例如输入字母'A',可以按下Alt键然后在小键盘上依次按数字键6和5,然后松开Alt键
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-15 23:39:37 | 显示全部楼层    本楼为最佳答案   
我也不清楚是否理解你的提问了。按照我对你的问题理解说一下个人看法。你所说的把'\n'换成'\0',是想把while循环的条件中的'\n'换成'\0'吗?那样是肯定不行的。

首先需要了解getchar(),它是从标准输入里读取一个字符,标准输入一般理解是键盘能输入的字符,这和ASCII表并不完全对应,例如ASCII表中回车换行是两个字符(ASCII码分别是13和10),在标准输入中是一个键。
然后再来理解'\n'和'\0','\0'是C语言中字符串的结束字符,在ASCII码中是0,即NULL,但是并不是标准输入的字符;'\n'是回车换行字符,是能够使用标准输入进行输入的字符。
最后看看程序的执行,你是无法使用标准输入来输入'\0'的,因此若用'\0'作为while循环判断也就无法结束循环。'\n'能够被getchar捕获,因此将之作为while循环结束的判断条件是可以结束while循环的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-16 12:17:05 | 显示全部楼层
sunrise085 发表于 2018-12-15 23:39
我也不清楚是否理解你的提问了。按照我对你的问题理解说一下个人看法。你所说的把'\n'换成'\0',是想把whil ...

明白了  谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-16 12:17:49 | 显示全部楼层
人造人 发表于 2018-12-15 23:14
'\0' 属于不可见字符
可以按下Alt键然后按小键盘上面的数字0键,一定是小键盘上面的0
可以通过按Alt+小键 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-16 12:19:29 | 显示全部楼层
ba21 发表于 2018-12-15 23:05
getchar()
又 putchar() 你打算什么时候结束?

  我把getchar()理解为scanf  putchar理解为printf()  所以我认为是可以结束的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-16 12:29:31 | 显示全部楼层
顾西凉 发表于 2018-12-16 12:19
我把getchar()理解为scanf  putchar理解为printf()  所以我认为是可以结束的

不好意思,我把putchar 看成 ungetch。失误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-16 12:39:28 | 显示全部楼层
ba21 发表于 2018-12-16 12:29
不好意思,我把putchar 看成 ungetch。失误

那我这样理解没有问题把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 08:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表