lql要赚钱 发表于 2021-10-6 01:16:53

课后作业中不太懂这句命令什么意思,求大佬帮助!

……
{
      int ch;
      int num = 0;

      printf("请输入待转换的字符串:");

      do
      {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        num = 10 * num + (ch - '0');
                }
         ……
      while (ch != '\n');

      printf("结果是:%d\n", num);

      return 0;
题目要求是 将用户输入的字符串中代表数字的字符转换为整型数值。但我不太理解标红这一句是什么意思,脑子好像转不过来了,求解答!

大马强 发表于 2021-10-6 07:37:23

这个你要看看ascii码表就知道了
假设你输入 asq1w1w2 ,能够满足if语句的是 ‘1’ ‘1’ ‘2’
每一个字符都是有对应的ascii码,字符的0~9对应ascii也是连续的,所以ch - '0得到的正好是转换成整型的它
比如 ‘1’对应的ascii是 49,而 ‘0’ 是 48,所以‘1’ - ‘0’ = 49 -48 =1,即 int("1"),剩下的以此类推
因为你最终打印的结果是112,因为已经转换成整型,要想在第一个1后面加上第二个1,只能进十,2也如此,所以10 * num作用是进位给后边的数腾空间

大马强 发表于 2021-10-6 07:38:13

https://static01.imgkr.com/temp/2b5abbdeb59e467b9fe2fe2f92fecfdd.png

桃花飞舞 发表于 2021-10-6 10:33:36

本帖最后由 桃花飞舞 于 2021-10-6 13:08 编辑

这两句就是把char数字转换成int型的数字。最后输出int型的数字,不过这个num*10和循环一起解决了int型数字的十百千万的位,而(ch-'0')解决了个位的数字。
我想到了这个题
反转整数 : 给定一个 32 位有符号整数,将整数中的数字进行反转。
int reverse(int x) {
    int ret=x,num=0;
    while(ret!=0)
    {
      //记录num改变之前的值
      int tmp=num;
      num=num*10+ret%10;
      //用已经改变的数去逆向推是否等于tmp,不等于则证明已经溢出,返回0
      if((num-ret%10)/10!=tmp)
      //若溢出num所求的余数和ret所求的余数肯定不相等,若不相等返回0
      if(num%10!=ret%10)
            return 0;
      ret/=10;
    }
    return num;
}
这题的num = num*10+ret%10;用的和你这里的num=num*10+(ch - '0');是一样的意思。

2736946915 发表于 2021-10-6 22:06:34

字符串比较,
先将字符串通过ASCII表转成int类型
然后在做+-
判断后转成bool类型

lql要赚钱 发表于 2021-10-7 02:45:55

桃花飞舞 发表于 2021-10-6 10:33
这两句就是把char数字转换成int型的数字。最后输出int型的数字,不过这个num*10和循环一起解决了int型数字 ...

举一反三太厉害了!!谢谢大神!
页: [1]
查看完整版本: 课后作业中不太懂这句命令什么意思,求大佬帮助!