鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 15

[已解决]输入小写字母,输出它在字母表的位数的

[复制链接]
发表于 2021-9-14 20:00:48 | 显示全部楼层 |阅读模式

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

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

x
新手一个,上次发问的帖子,不小心设为已解决了。抱歉了,我上次的问题叙述不够清楚,还望见谅。这次问的清楚一些。

这些是我在搜索过后,查找答案后还不理解的,希望能够得到指教
问题一:这里getchar与scanf 为什么都接收?
#include<stdio.h>//
int main( )
{
char i;
int d;
scanf( "%d" ,&d) ;
i=getchar() ;
d=i- 'a'+1;
printf( "%d",d);
return日;
}
我知道getchar 接收到是回车值10,可是,第一段代码,其实是一个输入小写字母,输出它在字母表的位数的。如果i=10的话,那第八行是如何运算的啊?
问题二:在代码实现四则运算里,
int a,b;
char x;
scanf("%d%d",&a,&b);
x=getchar();
a=a x b;
最佳答案
2021-9-15 08:14:59
努力的松 发表于 2021-9-15 06:29
啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗

你写的不符合规则
不能随便一个东西代表运算符号的
你知道 scanf("%d", %d); 这样写是对的,这就是规则
没有随便你写的那个规则
之前我给你回复的时候说过,C语言是编译型语言,要先编译,你说的要输入x 让它代表乘号,这都是运行以后的事,你都通不过编译你运行什么
你可能又要问了,为什么通不过编译,因为不符合规则
a = a x b;
你想要 x 代表乘号,那我可不可以这样写:a = a fasjdkghakulh b    a和b中间的代表乘号,这不是一个道理吗,能编译吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-14 20:18:31 | 显示全部楼层
函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。也就是说,后续的getchar()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
scanf():接收空格,制表符和回车键之前的输入串,不接收上述三种间隔符

char:它可以表示 -128~127的整数,也可以表示单个字符,需要加上单引号 ",加上单引号后表示的是ASCII码表的值,也就是说你看到的 'a' 他其实是以 97存储的,但是因为有单引号所以成ASCII码表的 a

第八行的运算就是把 'a' 在运算过程中换成了97 进行运算


第二段代码最后一行你写个 a = a x b
因为scanf() 的输入需要用 回车 来结束,按下的回车就被getchar() 给接收了

而且C语言没有你想的那么智能,a = a x b就是x通过getchar() 输入个乘号就行了?

你用的什么编译器?
C语言是编译型语言,也就是还没等运行就要全面检查错误
你想的 a = a x b   是运行以后怎样怎样,可是能通过编译吗?
通不过编译怎么运行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-14 20:25:39 | 显示全部楼层
问题一:我用的是devc++,在你这代码中 scanf()不执行的,因为你输入的是一个字符,而scanf要的是一个整型,所以scanf函数就被跳过了,输入的字符给getchar接收到,但你如果输入的是一个整型。那么结果永远是-86
问题二:有点不明白你要问啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-14 22:34:43 | 显示全部楼层
大马强 发表于 2021-9-14 20:25
问题一:我用的是devc++,在你这代码中 scanf()不执行的,因为你输入的是一个字符,而scanf要的是一个整型, ...

第一问说到点子上了,谢谢啦。
第二题的话,就是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号,这样为什么不能编译?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-14 22:36:55 | 显示全部楼层
Max472 发表于 2021-9-14 20:18
函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在 ...

感谢回答,第二题是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号,这样为什么不能编译。我是不是问的奇怪?只是我刚入门,疑问比较多吧。。
第一问我明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-14 23:27:05 | 显示全部楼层
努力的松 发表于 2021-9-14 22:36
感谢回答,第二题是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号, ...

你猜为什么 a = a x b   不能编译
jgioerawggeaipogia    你说这一行能编译吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-15 00:05:24 | 显示全部楼层
努力的松 发表于 2021-9-14 22:36
感谢回答,第二题是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号, ...

我说一下我自己的想法 针对第二个问题
要知道 C语言中又一个"输入流"的东西 这个应该是所有语言都有的
我们先假设你的输入是"1 * 1"
那么在输入流中 '1' ‘*’ '1' 这三个字符是以线性排列的
"scanf("%d%d", &a, &b);"语句中 按逻辑来说
第一个"%d"应该会获取输入流中的'1'
第二个就会获取 '*' 不过应该 '*' 不属于 int 类型
所以scanf()的返回值应该是 1
那么 x 获取的就应该是输入流中第二个 '1' 了
这上面是你的第二个问题中的第一个小问题
"a = a x b" 语句也是有问题
不过这里可以使用"switch()"函数搭配"case" 解决这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-15 06:27:21 | 显示全部楼层
临时用户3.14159 发表于 2021-9-15 00:05
我说一下我自己的想法 针对第二个问题
要知道 C语言中又一个"输入流"的东西 这个应该是所有语言都有的
...

那如果是输入“a b +"呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-15 06:29:55 | 显示全部楼层
Max472 发表于 2021-9-14 23:27
你猜为什么 a = a x b   不能编译
jgioerawggeaipogia    你说这一行能编译吗?

啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-15 07:02:38 | 显示全部楼层
努力的松 发表于 2021-9-15 06:29
啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗

哪你可以这么想,你要知道* - + / 算是特殊符号,不是一个变量和字符能够替代的
你getchar 接收的是一个字符 * ,当然是不可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-15 08:14:59 | 显示全部楼层    本楼为最佳答案   
努力的松 发表于 2021-9-15 06:29
啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗

你写的不符合规则
不能随便一个东西代表运算符号的
你知道 scanf("%d", %d); 这样写是对的,这就是规则
没有随便你写的那个规则
之前我给你回复的时候说过,C语言是编译型语言,要先编译,你说的要输入x 让它代表乘号,这都是运行以后的事,你都通不过编译你运行什么
你可能又要问了,为什么通不过编译,因为不符合规则
a = a x b;
你想要 x 代表乘号,那我可不可以这样写:a = a fasjdkghakulh b    a和b中间的代表乘号,这不是一个道理吗,能编译吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-15 09:08:23 | 显示全部楼层
Max472 发表于 2021-9-15 08:14
你写的不符合规则
不能随便一个东西代表运算符号的
你知道 scanf("%d", %d); 这样写是对的,这就是规则 ...

嗯,哈哈哈,才开始学,规则不太了解,书上没涉及,我就会发出很多问号。感谢教导,受教了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-15 09:11:18 | 显示全部楼层
大马强 发表于 2021-9-15 07:02
哪你可以这么想,你要知道* - + / 算是特殊符号,不是一个变量和字符能够替代的
你getchar 接收的是一个 ...

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

使用道具 举报

 楼主| 发表于 2021-9-15 09:15:40 | 显示全部楼层
下次多个问题还是分开帖子问吧,不然只能有一个最佳答案。。。库咩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-15 09:40:04 | 显示全部楼层
问题一:
/* 环境:Microsoft Visual C++ 2010 学习版
 * 文件名:charTest.c
 * 作用:理解字符型变量
 * 日期:2021 年 9 月 15 日
 */
#include <stdio.h>
#include <Windows.h>

int main( )
{
        char i;
        int d=0;

        scanf( "%d" ,&d) ;
        printf("d = %d\n", d);// 输入小写字母,无法存放到整型变量 d 标识的存储空间

        i = getchar();// getchar() 将输入的一个小写字母和后续的字符都存入了缓冲区
        d = i- 'a'+1;// 字符以 ASCII 码值(整型值)存在于计算机,'b'-'a' 将得到整型值 1
        printf( "%d\n",d);
        printf( "%d\n",getchar());//输出紧跟小写字母后的一个字符的 ASCII 码值

        system("pause");
        return 0;
}

编译运行,输入小写字母a+空格,再回车:
字符.jpg

编译运行,输入小写字母a,再回车:
字符2.jpg

问题二:
我的理解是,算术运算符用于对运算电路的控制,而字符存放于某部分存储单元,在计算机的总线中,它们不可能交叉控制
就像我用竹筷子吃做得非常像筷子的食物,不可能反过来,用做得非常像筷子的食物来夹起竹筷子往嘴里送。字符*和乘法运算符*表面上长得一模一样,但是本质上是两个不同类型的数据,前者是被操作数,后者是操作码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-15 09:44:51 | 显示全部楼层

问题一:你说的对,我写的那个答案是别人给的,scanf其实多余了,可我之前一直没搞懂
问题二:wc,膜拜了。这够专业啊。太棒了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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