当前位置:百问十四>百科问答>c语言输入一个字符串,内有数字和非数字,将其中连续的数字作为

c语言输入一个字符串,内有数字和非数字,将其中连续的数字作为

2024-06-29 23:01:08 编辑:join 浏览量:544

c语言输入一个字符串,内有数字和非数字,将其中连续的数字作为

首先*(p+i)就等于p[i],你可以把p类比成一个数组

48就是字符'0'的ascii码

这里的意思就是用来将一个个数字字符拼成一个整数

比如有4 5 6这三个字符,其ascii码分别是52 53 54,p指向4

b假设原来是0,b = *(p+0) - 48 + b*10= 52 - 48 = 4

第二次:b = *(p+1) - 48 + b*10= 53 - 48 + 4*10 = 5+40 = 45

第三次:b = *(p+2) - 48 + b*10= 53 - 48 + 45*10 = 6+450 = 456

懂了吧

下面这个循环是将字符串中的数字取出,例如字符串ads1sfdsf23dfdf,则a=1,a=23

for(i=0; *(p+i)!='\0'; i++)

{

if(*(p+i)>='0'&&*(p+i)<='9')//p[i]是0~9之间的字符,也就是数字字符

{

b=*(p+i)-48+b*10;//b=(p[i]-48)+b*10 (p[i]-48)是将p[i]转换成字符转换成对应的数字。

if (*(p+i+1)<'0'||*(p+i+1)>'9')//如果p[i]的下一个字符不是数字字符,则将p[i]写入到a[i]中。如果p[i]的下一个字符是数字字符,则将p[i]*10与下一位数字相加。即连续的数字字符,作为一个整数处理

{

a[j]=b;

j++;

b=0;

}

}

}

b=*(p+i)-48+b*10,就是计算数字字符的整数值

*(p+i)从p指向字符串中取出第i个字符;

- 48: 48是'0'的ASCII字符值,-48就是获取数字字符的数值,如:'0'- 48= 0, '9' - 48 = 9;

+b*10,将上次计算结果进位再累加

后面的代码就是计算好的整数b放到数组a中,最后打印输出

#include

using namespace std;

int main()

{

char str,*pstr;

int i,j,k,m,e10,digit,ndigit,a,*pa;

cout<<"input a string:"<

gets(str);

cout<

pstr=&str;

pa=&a;

ndigit=0;

i=0;//i代表字符串的第几个字符

j=0;//j代表连续数字的位数

while(*(pstr+i)!='\0')//字符串不等于结束符

{

if((*(pstr+i)>='0')&&(*(pstr+i)<='9'))//如果pstr指向0~9

j++;//j一个个输出

else

//大家帮一下忙用通俗的语言解释一下下面;

{

if(j>0)

{

digit=*(pstr+i-1)-48;//将单个字符0-9a scII码转换为整数型0-9 数值给digit

k=1;//k代表 查找到连续数字的倒数第几个字符串

while(k

{

e10=1;//e10代表1*10^(次方)

for(m=1;m<=k;m++)

e10=e10*10;//每个循环*10

digit=digit+(*(pstr+i-1-k)-48)*e10;

k++;

/*

比如说有3个连续的字符串是123,此循环是倒序循环查找数字字符

digit与e10的值变化

e10的值是1,digit=3 , 在上一步已经给他两个赋值了

循环1 e10=e10*10 e10的值是10,读取第二个字符2转化为整数后*e10 赋值给digit

digit=23

循环2 e10=e10*10 e10的值是100,读取第二个字符1转化为整数后*e10 赋值给digit

digit=123

*/

}

*pa=digit;

ndigit++;

pa++;

j=0;

}

}

i++;

}

if(j>0)

{

digit=*(pstr+i-1)-48;

k=1;

while(k

{

e10=1;

for(m=1;m<=k;m++)

e10=e10*10;

digit=digit+(*(pstr+i-1-k)-48)*e10;

k++;

}

*pa=digit;

ndigit++;

j=0;

}

printf("there are %d numbers in this line. they are:\n",ndigit);

j=0;

pa=&a;

for(j=0;j

cout<<*(pa+j)<

cout<

return 0;

}

此代码略显臃肿,可以这么写

代码越简洁,出错的概率越小,也越容易管理和修改

#include

using namespace std;

int main()

{

char str,*pstr,z;

int i,j,k,e10,digit,ndigit,a,*pa;

cout<<"input a string:"<

gets(str);

cout<

pstr=&str;

pa=&a;

ndigit=0;

i=0;//i代表字符串的第几个字符

j=0;//j代表连续数字的位数

while((*(pstr+i)!='\0')||(j>0))//字符串不等于结束符

{

if((*(pstr+i)>='0')&&(*(pstr+i)<='9'))//如果pstr指向0~9

{

j++;//j一个个输出

i++;

}

else if(j>0)

{

digit=0;

e10=1; //10的次方用于表示字符的个十百千万

for(k=1;k<=j;k++)//k代表 查找到连续数字的倒数第几个字符串

{

digit+=(*(pstr+i-k)-48)*e10;

e10=e10*10;

}

*pa=digit;

ndigit++;

pa++;

j=0;

}else i++;

}

printf("共有 %d 个连续的整数:\n",ndigit);

j=0;

pa=&a;

for(j=0;j

cout<<*(pa+j)<

cout<

return 0;

}

标签:数字,字符串,内有

版权声明:文章由 百问十四 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.baiwen14.com/answer/171826.html
热门文章