鱼C论坛

 找回密码
 立即注册
查看: 1445|回复: 6

[已解决]萌新求助,望有大佬帮助

[复制链接]
发表于 2018-10-11 00:04:41 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
求教为什么运行的结果会是我输入的大写字母的一半啊?不是很懂
最佳答案
2018-10-11 11:28:13
本帖最后由 calton007 于 2018-10-11 11:40 编辑

getchar()函数使用了两次是从缓冲区获取两个字符,并不是同一个字符
getchar()>='A' && getchar()<='Z'
如果这么写,循环条件变成了:
读取两个字符,第一个字符的ASCII比'A'大,第二个字符的ASCII比'Z'小,这两个条件同时满足,count+1
举个例子,假设输入"a a a "(小写字母a和空格),这个字符串是满足循环条件的,count结果为3,显然不符合统计大写字母的要求

楼主的思路是正确的,但是没能用编程语言正确的表达出来,我们一起再理一下:
第一步,获取一个字符
第二步,判断这个字符是不是大写字母:
    如果这个字符是大写字母,count + 1
    如果这个字符不是大写字母,返回第一步

然后我们来考虑一下如何实现,这个程序主要由两个部分组成:循环输入字符 和 判断字符是否为大写字母
1、循环输入
        循环条件为每次输入一个字符,直到输入回车结束循环
        每次调用getchar()都会从缓冲区读取一个字符,为了方便后续的判断,可以使用一个char变量(假设这样定义 char c;)存读取的字符
        因此可以写作while((c = getchar()) != '\n'),先执行getchar()读取字符并给c赋值,然后判断读取的字符是否是'\n'
2、判断字符是否为大写字母
        夸一下楼主没有把表达式写成 'A' <= getchar() <= 'Z',但由于调用了两次getchar()导致判断的不是同一个字符所以出现了错误
        因此判断c是否是大写字母,写作c>='A' && c<='Z',这样就保证了是对同一个字符进行判断

具体代码我就不直接给出啦,相信楼主在理清思路之后,一定可以很轻松写出来~~~

1539187404772..jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-11 00:26:12 | 显示全部楼层
因为你用了两次 getchar()
getchar() 不是用来要求输入的函数,而是从输入缓冲区里提出一个字符
用 scanf()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-11 11:28:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 calton007 于 2018-10-11 11:40 编辑

getchar()函数使用了两次是从缓冲区获取两个字符,并不是同一个字符
getchar()>='A' && getchar()<='Z'
如果这么写,循环条件变成了:
读取两个字符,第一个字符的ASCII比'A'大,第二个字符的ASCII比'Z'小,这两个条件同时满足,count+1
举个例子,假设输入"a a a "(小写字母a和空格),这个字符串是满足循环条件的,count结果为3,显然不符合统计大写字母的要求

楼主的思路是正确的,但是没能用编程语言正确的表达出来,我们一起再理一下:
第一步,获取一个字符
第二步,判断这个字符是不是大写字母:
    如果这个字符是大写字母,count + 1
    如果这个字符不是大写字母,返回第一步

然后我们来考虑一下如何实现,这个程序主要由两个部分组成:循环输入字符 和 判断字符是否为大写字母
1、循环输入
        循环条件为每次输入一个字符,直到输入回车结束循环
        每次调用getchar()都会从缓冲区读取一个字符,为了方便后续的判断,可以使用一个char变量(假设这样定义 char c;)存读取的字符
        因此可以写作while((c = getchar()) != '\n'),先执行getchar()读取字符并给c赋值,然后判断读取的字符是否是'\n'
2、判断字符是否为大写字母
        夸一下楼主没有把表达式写成 'A' <= getchar() <= 'Z',但由于调用了两次getchar()导致判断的不是同一个字符所以出现了错误
        因此判断c是否是大写字母,写作c>='A' && c<='Z',这样就保证了是对同一个字符进行判断

具体代码我就不直接给出啦,相信楼主在理清思路之后,一定可以很轻松写出来~~~

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
1245777533 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2018-10-11 12:36:53 From FishC Mobile | 显示全部楼层
谢谢大佬(ω)hiahiahia ,感觉瞬间清晰了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 21:12:48 | 显示全部楼层
calton007 发表于 2018-10-11 11:28
getchar()函数使用了两次是从缓冲区获取两个字符,并不是同一个字符

如果这么写,循环条件变成了:

其实想问问 'A' <= getchar() <= 'Z'
与c>='A' && c<='Z'的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-12 09:16:52 | 显示全部楼层

先讲几个知识点
1、逻辑表达式的值
        在 C语言 中没有布尔型变量的,因此 C语言 用 0 表示假,1 表示真
        就是说逻辑表达式最后的结果本质上是0或者1
 printf("%d, %d", (1==1), (0==1));
        可以尝试一下这个语句,看看输出结果。

2、变量可以判断真假吗?
        答案是可以的,上面已经提到了逻辑表达式最后的结果本质上是 0 或者 1
        在 C语言 中: 0 为假,非 0 为真
        也就是说一个变量的值是 0 为假,如:int a = 0;  float b = 0.0; char c='\0';(字符的本质是 ASCII 码,'\0'的 ASCII 码为 0) 这几个变量做逻辑判断最后的结果都为假
        可以这么验证:
#include <stdio.h>
int main()
{
        int a = 0;
        if(a)
                print("True"); //如果a为真
        else
                print("False"); //如果a为假
        return 0;
}

回到正题,假设定义char c = ' ';  (一个空格字符,ASCII码为32)。计算表达式 'A' <= c <= 'Z' ,从左到右计算:
(1)先计算 'A' <= c
        'A' 的 ASCII 码为65,空格的 ASCII 码为32,表达式为假,结果为0
(2)计算 0 <= 'Z'
        'Z' 的 ASCII 码为90,0 <= 90表达式为真,结果为1
所以如果这么写 'A' <= c <= 'Z' 并不是我们要表达的意思

而如果计算 c>= 'A' && c<= 'Z',同样从左到右计算:先计算 c>='A',结果为0,然后就不用继续计算了,因为&&只要有一侧为假,最后的结果就为假
再补充个知识点:
        在C语言中这个现象叫做“逻辑短路”,&&和||运算符都有这个现象,&&运算符左侧为假,||运算符左侧为真,那么运算符右侧的表达式是不会执行的

所以这种情况要拆成两个表达式来写,不能像数学中那样写(但其他语言有支持这种写法的,例如Python)


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

使用道具 举报

 楼主| 发表于 2018-10-12 22:18:13 | 显示全部楼层
calton007 发表于 2018-10-12 09:16
先讲几个知识点
1、逻辑表达式的值
        在 C语言 中没有布尔型变量的,因此 C语言 用 0 表示假,1 表示真
...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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