鱼C论坛

 找回密码
 立即注册
查看: 747|回复: 14

[已解决]新手求助一下getchar这个问题

[复制链接]
发表于 2020-8-4 21:21:28 | 显示全部楼层 |阅读模式

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

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

x
while((ch=getchar() != '\n')



while(ch=getchar() != '\n')

这两个区别是啥,为啥我如果写下面这种的话程序就运行错误呢? (我想应该是跟优先级有关,但是不太懂)
还有就是为什么这个 '\n' 就表示换行符?
最佳答案
2020-8-4 21:32:22
第一种写法:while((ch=getchar() != '\n'),少了半个括号,while((ch=getchar()) != '\n')
加上之后就对了。
先将getchar获取的键盘输入字符赋值给ch,然后判断该字符是不是'\n',若不是的话,则进行循环。ch为键盘输入的字符

第二种写法:while(ch=getchar() != '\n'),因为优先级问题,会先进行不等于判断,然后在将判断结果赋值给ch,ch为0或1

两种写法都能达到非'\n'即循环的目的,但是ch值不一样,第一种写法,ch为键盘输入的字符,第二种写法,ch为0或1

'\n'为回车,这是语法规定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-4 21:22:17 | 显示全部楼层
本帖最后由 xiaosi4081 于 2020-8-4 21:24 编辑

ch=getchar()的意思是获得一个字符给ch,如果获得的字符不是'\n'(回车符),就执行循环,否则退出循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 21:27:01 | 显示全部楼层
\n 就是 \n ,没有什么为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 21:30:12 | 显示全部楼层
xiaosi4081 发表于 2020-8-4 21:22
ch=getchar()的意思是获得一个字符给ch,如果获得的字符不是'\n'(回车符),就执行循环,否则退出循环。

我的意思是上下两个不同表达式那个括号的区别体现在哪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 21:30:51 | 显示全部楼层
学编程的盆子 发表于 2020-8-4 21:30
我的意思是上下两个不同表达式那个括号的区别体现在哪

第一个不符合语法啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 21:31:42 | 显示全部楼层
while ((ch = getchar()) != '\n')
和while (ch = getchar() != '\n')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 21:32:20 | 显示全部楼层
应该是这两个的区别 打错了抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 21:32:22 | 显示全部楼层    本楼为最佳答案   
第一种写法:while((ch=getchar() != '\n'),少了半个括号,while((ch=getchar()) != '\n')
加上之后就对了。
先将getchar获取的键盘输入字符赋值给ch,然后判断该字符是不是'\n',若不是的话,则进行循环。ch为键盘输入的字符

第二种写法:while(ch=getchar() != '\n'),因为优先级问题,会先进行不等于判断,然后在将判断结果赋值给ch,ch为0或1

两种写法都能达到非'\n'即循环的目的,但是ch值不一样,第一种写法,ch为键盘输入的字符,第二种写法,ch为0或1

'\n'为回车,这是语法规定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 21:34:24 | 显示全部楼层
sunrise085 发表于 2020-8-4 21:32
第一种写法:while((ch=getchar() != '\n'),少了半个括号,while((ch=getchar()) != '\n')
加上之后就对 ...

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

使用道具 举报

发表于 2020-8-4 21:34:53 | 显示全部楼层
学编程的盆子 发表于 2020-8-4 21:31
while ((ch = getchar()) != '\n')
和while (ch = getchar() != '\n')

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

使用道具 举报

 楼主| 发表于 2020-8-4 21:47:15 | 显示全部楼层
sunrise085 发表于 2020-8-4 21:32
第一种写法:while((ch=getchar() != '\n'),少了半个括号,while((ch=getchar()) != '\n')
加上之后就对 ...
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define NUM 128

  4. int main()
  5. {
  6.         int ch, i, j = 0, max = 0;
  7.         int input_num = 0;
  8.         int ascii[NUM] = {0};
  9.         char count[NUM] = "";

  10.         printf("请输入英文文本:");

  11.         while ((ch = getchar()) != '\n')
  12.         {
  13.                 ascii[ch]++; // 字符对应的ASCII码加1
  14.                 input_num++;
  15.         }
复制代码


这里的ascii[ch]++ 是啥意思啊 ch不是存储的字符吗,怎么又变成ascii码了 这里看不懂 大佬解释一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 21:55:46 | 显示全部楼层
学编程的盆子 发表于 2020-8-4 21:47
这里的ascii[ch]++ 是啥意思啊 ch不是存储的字符吗,怎么又变成ascii码了 这里看不懂 大佬解释一下

C语言中char类型实际上也是整型的一部分,每个字符都有对应的ASCII码值。
例如你输入的是'a' ,那么ch='a','a'的ASCII码值是97,这里就是 ascii[97]++
每输入一个字符,在数组ascii[]中与该字符ASCII码值对应下标的值就会自加一,这就达到了统计的目的。
例如输入一串字符之后,ascii[35]自加了五次,ascii[35]=5,说明你输入的字符串中有5个ASCII码值为35的字符,ASCII码值为35的字符是#,也就是你输入了五个#。其他字符也一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 22:12:33 | 显示全部楼层
sunrise085 发表于 2020-8-4 21:55
C语言中char类型实际上也是整型的一部分,每个字符都有对应的ASCII码值。
例如你输入的是'a' ,那么ch=' ...

懂了 char好像小甲鱼也说到了是特殊的整型 然后这样理解嗯嗯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 22:21:44 | 显示全部楼层
sunrise085 发表于 2020-8-4 21:55
C语言中char类型实际上也是整型的一部分,每个字符都有对应的ASCII码值。
例如你输入的是'a' ,那么ch=' ...

#include <stdio.h>
#include <string.h>

#define NUM 128

int main()
{
        int ch, i, j = 0, max = 0;
        int input_num = 0;
        int ascii[NUM] = {0};
        char count[NUM] = "";

        printf("请输入英文文本:");

        while ((ch = getchar()) != '\n')
        {
                ascii[ch]++; // 字符对应的ASCII码加1
                input_num++;
        }

        for (i = 0; i < NUM; i++)
        {
                if (ascii)
                {
                        count[j++] = i;
                        if (ascii > ascii[max])
                        {
                                max = i;
                        }
                }
        }

        printf("你总共输入了%d个字符,其中不同的字符个数有%d个。\n", input_num, strlen(count));
        printf("它们是:%s\n", count);
        printf("出现次数最多的字符是\'%c\',它总共出现了%d次。\n", max, ascii[max]);

        return 0;
}[/code]

这个for开始又给我整懵了 我理解他不是从i=0开始,然后如果ascii 有值,那这里的i比如说等于97,也就是你刚说的a。下面他又 count[j++]=i;就这里给我整懵了 。你看下我前面说的对不对头
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 22:28:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 03:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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