鱼C论坛

 找回密码
 立即注册
楼主: 1613551

[已解决]有人可以帮我分析一下小甲鱼的程序吗?

[复制链接]
 楼主| 发表于 2022-4-12 14:08:59 | 显示全部楼层
人造人 发表于 2022-4-12 13:52
第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10 ...


还没打完,不是这个,不好意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 14:10:53 | 显示全部楼层
1613551 发表于 2022-4-12 14:08
还没打完,不是这个,不好意思

没事,你慢慢组织语言,描述清楚你的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:14:23 | 显示全部楼层
本帖最后由 1613551 于 2022-4-12 14:19 编辑
人造人 发表于 2022-4-12 13:52
第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10 ...

  1. while ((ch = getchar()) != '\n')
复制代码

比如这个程序,getchar()就是接收用户输入的字符是吗?然后把用户输入的字符依次放进ch里面,后面的!=0,其实我不是很懂!=0的概念,是!=0的时候为真吗?
然后我的疑惑就是假设我现在已经在键盘上输入了b,程序是还在循环的是吧?因为我没有按下回车也就是没有输出\n,那么执行到第5行的时候,putchar不会检测到ch里面有个值b吗?那么这时候不会输出putchar('a' + (ch - 'a' + 3) % 26)里面的数据吗?
  1. while ((ch = getchar()) != '\n')
  2.         {
  3.                 if (ch >= 'a' && ch <= 'z')
  4.                 {
  5.                         putchar('a' + (ch - 'a' + 3) % 26);
  6.                         continue;
  7.                 }

  8.                 if (ch >= 'A' && ch <= 'Z')
  9.                 {
  10.                         putchar('A' + (ch - 'A' + 3) % 26);
  11.                         continue;
  12.                 }

  13.                 putchar(ch);
  14.         }

  15.         putchar('\n');
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:18:56 | 显示全部楼层
人造人 发表于 2022-4-12 14:10
没事,你慢慢组织语言,描述清楚你的问题

不好意思,是第五行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 14:21:42 | 显示全部楼层
1613551 发表于 2022-4-12 14:14
比如这个程序,getchar()就是接收用户输入的字符是吗?然后把用户输入的字符依次放进ch里面,后面 ...

后面的!=0,其实我不是很懂!=0的概念,是!=0的时候为真吗?
等于和不等于么,就是一个反逻辑
  1. $ cat main.c
  2. #include <stdio.h>

  3. int main(void) {
  4.     int n = 123;
  5.     if(n == 0) printf("5: n == 0\n");
  6.     if(n != 0) printf("6: n != 0\n");
  7.     n = 0;
  8.     if(n == 0) printf("8: n == 0\n");
  9.     if(n != 0) printf("9: n != 0\n");
  10.     return 0;
  11. }
  12. $ gcc-debug -o main main.c
  13. $ ./main
  14. 6: n != 0
  15. 8: n == 0
  16. $
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 14:22:46 | 显示全部楼层
1613551 发表于 2022-4-12 14:14
比如这个程序,getchar()就是接收用户输入的字符是吗?然后把用户输入的字符依次放进ch里面,后面 ...

因为我没有按下回车也就是没有输出\n
输出?
是getchar没有得到 '\n'
也就是ch中没有保存 '\n'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:23:31 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 13:50
一、
putchar()函数是输出一个字符
当给它的参数不是一个字符常量如“A”,也不是字符变量,如之前有定 ...

感觉好奇怪,比如这个程序为什么我输入50就是输出了50,而不是按照ASCII码里50输出2
  1. #include <stdio.h>

  2. int main() {
  3.         int ch;
  4.         printf("请输入:");

  5.         while ((ch = getchar()) != '\n') {
  6.                 if (ch >= 32 && ch <= 126) {
  7.                         putchar(ch);
  8.                 }

  9.         }

  10.         putchar('\n');

  11.         return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 14:25:20 | 显示全部楼层
1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把值给输出出来呢?

看看这个能不能看懂

  1. $ cat main.c
  2. #include <stdio.h>

  3. int main()
  4. {
  5.         int ch;

  6.         printf("请输入明文:");

  7.         while ((ch = getchar()) != '\n')
  8.         {
  9.             printf("11: %c\n", ch);
  10.                 if (ch >= 'a' && ch <= 'z')
  11.                 {
  12.             printf("14: %c\n", ch);
  13.             printf("15: %c\n", 'a' + (ch - 'a' + 3) % 26);
  14.                         putchar('a' + (ch - 'a' + 3) % 26);
  15.                         continue;
  16.                 }

  17.                 if (ch >= 'A' && ch <= 'Z')
  18.                 {
  19.                         putchar('A' + (ch - 'A' + 3) % 26);
  20.                         continue;
  21.                 }

  22.                 putchar(ch);
  23.         }

  24.         putchar('\n');

  25.         return 0;
  26. }
  27. $ gcc-debug -o main main.c
  28. $ ./main
  29. 请输入明文:b
  30. 11: b
  31. 14: b
  32. 15: e
  33. e
  34. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:28:41 | 显示全部楼层
人造人 发表于 2022-4-12 14:21
后面的!=0,其实我不是很懂!=0的概念,是!=0的时候为真吗?
等于和不等于么,就是一个反逻辑

你这代码我看不是很懂,也就是说如果一个数==0的时候为真,那么!=的时候就是这个数不等于0就为真
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:30:34 | 显示全部楼层
人造人 发表于 2022-4-12 14:22
因为我没有按下回车也就是没有输出\n
输出?
是getchar没有得到 '\n'

感觉很奇怪,那我输入了b了,getchar()把值给b了,那么下面putchar为什么没有输出,而是等到得到了‘\n'以后puchar才输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:31:15 | 显示全部楼层
人造人 发表于 2022-4-12 14:25
看看这个能不能看懂

好的,我看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:35:52 | 显示全部楼层
人造人 发表于 2022-4-12 14:25
看看这个能不能看懂

我不是很理解加了一些printf上去有什么用吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 14:41:25 | 显示全部楼层
1613551 发表于 2022-4-12 14:23
感觉好奇怪,比如这个程序为什么我输入50就是输出了50,而不是按照ASCII码里50输出2

见我的第二段
getchar()是一次接收一个字符
不过里面有一点我没提到,字符常量赋值给一个整型变量时,是把该字符的ASCII码值赋给这个整型变量
你通过getchar()输入的都是字符 (型),而不是int之类的数字

你在while循环里的开头,if判断的前面,添加一条printf语句打印一下ch的值就知道的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:46:07 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 14:41
见我的第二段
getchar()是一次接收一个字符
不过里面有一点我没提到,字符常量赋值给一个整型变量时, ...

好的好的,我懂了,刚刚上了个厕所回来,我就想通了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 14:47:17 | 显示全部楼层
人造人 发表于 2022-4-12 14:25
看看这个能不能看懂

把大佬都吓跑了,没事,估计我以后就懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 15:12:01 | 显示全部楼层
1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把值给输出出来呢?

我大概明白你想问的是什么了
你是想说,明明getchar()和putchar()都是一次只输入(输出)一个字符
但输出结果不是”键盘输入一个字符,就接着打印出一个字符“,而是”全部输入结束后,才一次性全部打印出来“
是这样吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 15:24:05 From FishC Mobile | 显示全部楼层
1613551 发表于 2022-4-12 14:47
把大佬都吓跑了,没事,估计我以后就懂了

现在在外面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 15:31:22 From FishC Mobile | 显示全部楼层
1613551 发表于 2022-4-12 14:35
我不是很理解加了一些printf上去有什么用吗

输出在这个位置的时候ch变量中的值,让你更好的理解程序,这是调试程序的一种方法,用printf输出变量的值,输出表达式的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 15:32:43 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 15:12
我大概明白你想问的是什么了
你是想说,明明getchar()和putchar()都是一次只输入(输出)一个字符
但输 ...

对对对,就是这个意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 15:34:28 | 显示全部楼层
人造人 发表于 2022-4-12 15:31
输出在这个位置的时候ch变量中的值,让你更好的理解程序,这是调试程序的一种方法,用printf输出变量的值 ...

原来如此
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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