c 指针从字符串中提取整数


#include<stdio.h>

int main()
{
    char str[81],*p=str;
    int num,count=0;
    printf("请输入一个包括多段数字的字符串:\n");
    gets(str);
    printf("从该字段中找到的整数有:\n");
    while(*p)
    {
        if(*p>='0'&&*p<='9')
        {
            for(num=0;*p>='0'&&*p<='9';p++)
            {
               num=num*10+(*p-'0');   //*p-'0'表示将数字字符*p转为数字 
            }
            count++;
            printf("NO.%d:%d\n",count,num);
        }
        else
        {
            while(*p!='\n'&&(*p<'0'||*p>'9'))
            {
                p++;
            }
        }
     }
     printf("\n共找到%d个整数.\n",count);
     return  0;
 } 

求解释一下 num=num10+(p-'0'); 这一句,我不理解这是怎么把p-'0'表示将数字字符p转为数字 ?还有num10的作用,和num10这里为什么必须是10,换个其他数,结果就不成立了!

因为p是char类型,所以p就是char型,char型存储的是字符的ASCII码,比如'0'的ASCII码是48。如果把char转换为整数处理,那么'0'对应的整数0的转换方法就是 将char值减去'0'
至于乘以10,因为你字符串转换出来的是10进制整数啊,当然乘以10
比如字符串"123",共三个字符,那么转换过程就是遍历每一个字符,然后加起来到sum变量
第一次取出字符'1',对应的整数是1,通过 '1'-'0'计算差值就是对应的数字。赋值给sum,此时sum=1
第二次取出字符‘2’,对应整数为2,sum = sum * 10 + '2' - '0' = 1 * 10 + 2= 12
第三次取出字符'3',同样处理,sum = sum * 10 + '3' - '0' = 12 * 10 + 3 = 123
转换完成
能理解吧

p-'0'就是把p现在的那个字符的ascii码减去0的ascii码,得到的差值就是这个字符代表的数字了。
比如'0'的ascii码是30,‘4’的ascii码是34,所以‘4’-‘0’=4。
至于num10这个,因为数字是10进制的。
比如 你输入的是'123',根据刚刚的算法你能得到 1、2、3三个数字,必须要在对应的位置乘以对应的进制的值才行
(1
10 + 2)*10 + 3