鱼C论坛

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

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

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


还没打完,不是这个,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没事,你慢慢组织语言,描述清楚你的问题
想知道小甲鱼最近在做啥?请访问 -> 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 ...

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

                if (ch >= 'A' && ch <= 'Z')
                {
                        putchar('A' + (ch - 'A' + 3) % 26);
                        continue;
                }

                putchar(ch);
        }

        putchar('\n');
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,是第五行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main(void) {
    int n = 123;
    if(n == 0) printf("5: n == 0\n");
    if(n != 0) printf("6: n != 0\n");
    n = 0;
    if(n == 0) printf("8: n == 0\n");
    if(n != 0) printf("9: n != 0\n");
    return 0;
}
$ gcc-debug -o main main.c
$ ./main 
6: n != 0
8: n == 0
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

因为我没有按下回车也就是没有输出\n
输出?
是getchar没有得到 '\n'
也就是ch中没有保存 '\n'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main() {
        int ch;
        printf("请输入:");

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

        }

        putchar('\n');

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

使用道具 举报

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

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

看看这个能不能看懂
$ cat main.c
#include <stdio.h>

int main()
{
        int ch;

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

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

                if (ch >= 'A' && ch <= 'Z')
                {
                        putchar('A' + (ch - 'A' + 3) % 26);
                        continue;
                }

                putchar(ch);
        }

        putchar('\n');

        return 0;
}
$ gcc-debug -o main main.c
$ ./main 
请输入明文:b
11: b
14: b
15: e
e
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你这代码我看不是很懂,也就是说如果一个数==0的时候为真,那么!=的时候就是这个数不等于0就为真
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感觉很奇怪,那我输入了b了,getchar()把值给b了,那么下面putchar为什么没有输出,而是等到得到了‘\n'以后puchar才输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

我不是很理解加了一些printf上去有什么用吗
想知道小甲鱼最近在做啥?请访问 -> 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的值就知道的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的好的,我懂了,刚刚上了个厕所回来,我就想通了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

把大佬都吓跑了,没事,估计我以后就懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

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

使用道具 举报

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

输出在这个位置的时候ch变量中的值,让你更好的理解程序,这是调试程序的一种方法,用printf输出变量的值,输出表达式的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对对对,就是这个意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 22:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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