输入小写字母,输出它在字母表的位数的
新手一个,上次发问的帖子,不小心设为已解决了。抱歉了,我上次的问题叙述不够清楚,还望见谅。这次问的清楚一些。这些是我在搜索过后,查找答案后还不理解的,希望能够得到指教
问题一:这里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;
函数的返回值为用户输入的第一个字符的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 是运行以后怎样怎样,可是能通过编译吗?
通不过编译怎么运行? 问题一:我用的是devc++,在你这代码中 scanf()不执行的,因为你输入的是一个字符,而scanf要的是一个整型,所以scanf函数就被跳过了,输入的字符给getchar接收到,但你如果输入的是一个整型。那么结果永远是-86
问题二:有点不明白你要问啥 大马强 发表于 2021-9-14 20:25
问题一:我用的是devc++,在你这代码中 scanf()不执行的,因为你输入的是一个字符,而scanf要的是一个整型, ...
第一问说到点子上了,谢谢啦。
第二题的话,就是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号,这样为什么不能编译? Max472 发表于 2021-9-14 20:18
函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在 ...
感谢回答,第二题是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号,这样为什么不能编译。我是不是问的奇怪?只是我刚入门,疑问比较多吧。。
第一问我明白了。 努力的松 发表于 2021-9-14 22:36
感谢回答,第二题是我不太理解为什么a=a x b,a,b是用scanf接收的数字,x是getchar接收的加减乘除符号, ...
你猜为什么 a = a x b 不能编译
jgioerawggeaipogia 你说这一行能编译吗? 努力的松 发表于 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" 解决这个问题 临时用户3.14159 发表于 2021-9-15 00:05
我说一下我自己的想法 针对第二个问题
要知道 C语言中又一个"输入流"的东西 这个应该是所有语言都有的
...
那如果是输入“a b +"呢?{:9_241:} Max472 发表于 2021-9-14 23:27
你猜为什么 a = a x b 不能编译
jgioerawggeaipogia 你说这一行能编译吗?
啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗{:9_221:} 努力的松 发表于 2021-9-15 06:29
啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗
哪你可以这么想,你要知道* - + / 算是特殊符号,不是一个变量和字符能够替代的
你getchar 接收的是一个字符 * ,当然是不可以的 努力的松 发表于 2021-9-15 06:29
啊这,那个x不是接收的是符号吗,所以我就想。。抱歉脑子还是转不过来,能再详细一点吗
你写的不符合规则
不能随便一个东西代表运算符号的
你知道 scanf("%d", %d); 这样写是对的,这就是规则
没有随便你写的那个规则
之前我给你回复的时候说过,C语言是编译型语言,要先编译,你说的要输入x 让它代表乘号,这都是运行以后的事,你都通不过编译你运行什么
你可能又要问了,为什么通不过编译,因为不符合规则
a = a x b;
你想要 x 代表乘号,那我可不可以这样写:a = a fasjdkghakulh b a和b中间的代表乘号,这不是一个道理吗,能编译吗? Max472 发表于 2021-9-15 08:14
你写的不符合规则
不能随便一个东西代表运算符号的
你知道 scanf("%d", %d); 这样写是对的,这就是规则 ...
嗯,哈哈哈,才开始学,规则不太了解,书上没涉及,我就会发出很多问号。感谢教导,受教了。
大马强 发表于 2021-9-15 07:02
哪你可以这么想,你要知道* - + / 算是特殊符号,不是一个变量和字符能够替代的
你getchar 接收的是一个 ...
嗯,秒懂。感谢{:9_228:} {:10_245:}下次多个问题还是分开帖子问吧,不然只能有一个最佳答案。。。{:10_250:}库咩 问题一:
/* 环境: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+空格,再回车:
编译运行,输入小写字母a,再回车:
问题二:
我的理解是,算术运算符用于对运算电路的控制,而字符存放于某部分存储单元,在计算机的总线中,它们不可能交叉控制。
就像我用竹筷子吃做得非常像筷子的食物,不可能反过来,用做得非常像筷子的食物来夹起竹筷子往嘴里送。字符*和乘法运算符*表面上长得一模一样,但是本质上是两个不同类型的数据,前者是被操作数,后者是操作码。 Cardist 发表于 2021-9-15 09:40
问题一:
问题一:你说的对,我写的那个答案是别人给的,scanf其实多余了,可我之前一直没搞懂{:9_240:}
问题二:wc,膜拜了。这够专业啊。太棒了。{:9_231:}
页:
[1]