输入一个字符串,内含数字和非数字字符 输入一个字符串,这个字符串包含了数字和非数字字符。例如:

作者&投稿:全辉 (若有异议请与网页底部的电邮联系)
下面这个循环是将字符串中的数字取出,例如字符串ads1sfdsf23dfdf,则a[0]=1,a[1]=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;
}
}
}

首先*(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

懂了吧

#include
using namespace std;
int main()
{
char str[50],*pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
cout<<"input a string:"<<endl;
gets(str);
cout<<endl;
pstr=&str[0];
pa=&a[0];
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<j)
{
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<j)
{
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[0];
for(j=0;j<ndigit;j++)
cout<<*(pa+j)<<endl;
cout<<endl;
return 0;
}

此代码略显臃肿,可以这么写
代码越简洁,出错的概率越小,也越容易管理和修改
#include
using namespace std;
int main()
{
char str[50],*pstr,z;
int i,j,k,e10,digit,ndigit,a[10],*pa;
cout<<"input a string:"<<endl;
gets(str);
cout<<endl;
pstr=&str[0];
pa=&a[0];
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[0];
for(j=0;j<ndigit;j++)
cout<<*(pa+j)<<endl;
cout<<endl;
return 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 "stdio.h"#include "string.h"int main(int argv,char *argc[]){char s[100];int a[100],i,j,n,ln;printf("Please enter an arbitrary string with Numbers:
");fgets(s,100,stdin);for(ln=strlen(s),j=i=0;i='0' && s[i]<='9'){sscanf(s+i,"%d%n",a+j++,&n);i+=n-1;}printf("
In your input string detected %d integers.
They are:",j);for(i=0;i<j;printf("%d ",a[i++]));printf("

");return 0;}运行举例:

#include "stdio.h"#include "string.h"int main(int argv,char *argc[]){char s[100];int a[100],i,j,n,ln;printf("Please enter an arbitrary string with Numbers:
");fgets(s,100,stdin);for(ln=strlen(s),j=i=0;i='0' && s[i]<='9'){sscanf(s+i,"%d%n",a+j++,&n);i+=n-1;}printf("
In your input string detected %d integers.
They are:",j);for(i=0;i<j;printf("%d ",a[i++]));printf("

");return 0;}运行举例:

输入一个字符串,内有数字和非数字字符,将其中连续的数字作为一个整数...
答:int i,j,k,h,n=0;double sum=0;int a[10];//定义一个数组存储每次检验得到的字符串中的整形数字 k=strlen(p1);//计算出输入的字符串的长度 for (i=0,j=0;i<k;i++){ if(*(p1+i)>='0' && *(p1+i)<='9'){ a[j]=*(p1+i);j++;//变量j用于记忆连续检测到的整数个数...

输入一个字符串,串内有数字和非数字字符。例如:abc456 sd78fd123s...
答:include <string.h> define MAXLEN 128 int main(int argc,char* argv[]){ char a[]="b123,0456 7890a"; //将非字符的数清早,相邻的数字当成整数输出 long int b[MAXLEN]={0};// char c[MAXLEN];char str[MAXLEN];// char *p;int i=0,k=0;int j=0,n=0;while (1){ ...

输入一个字符串,串内有数字和非数字字符。例如:
答:i,j,n,ln;printf("Please enter an arbitrary string with Numbers:\n");fgets(s,100,stdin);for(ln=strlen(s),j=i=0;i<ln;i++)if(s[i]>='0' && s[i]<='9'){sscanf(s+i,"%d%n",

输入一个字符串,内有数字和非数字字符。
答:digit=*(pstr+i-1)-48;//将单个字符0-9a scII码转换为整数型0-9 数值给digit k=1;//k代表 查找到连续数字的倒数第几个字符串 while(k<j){ e10=1;//e10代表1*10^(次方)for(m=1;m<=k;m++)e10=e10*10;//每个循环*10 digit=digit+(*(pstr+i-1-k)-48)*e10;k++;/ 比如...

编写c++程序,将用户输入的由数字字符和非数字字符组成的字符串中的...
答:int main(){char a[1000];int i=0;printf ("输入字符串:\n");gets(a);printf("输出结果:\n");while(a[i]){ if(a[i]>='0'&&a[i]<='9')printf("%c",a[i]);if(a[i]>='0'&&a[i]<='9'&&(a[i+1]<'0'||a[i+1]>'9')) /*如果是最后一位数字,则换行*/ ...

1.输入一个字符串(不超过50个字符),内有数字和非数字字符 ,如: a
答:include <stdio.h>#include "string.h"int main(void){ char s[51]; int d[25],i,j,k; printf("Please enter a string, the length <= 50...\ns="); if(!gets(s) && strlen(s)>50){ printf("Input error, exit...\n"); return 0; } for(j=i=...

1.输入一个字符串(不超过50个字符),内有数字和非数字字符
答:void main(){ int flag=0,digit=0,a[10],i,n=0;char b[51];cin>>b;for(i=0;i<strlen(b);i++){ while((b[i]>='0')&&(b[i]<='9')){ flag=1;digit=digit*10+b[i]-'0';i++;} if(flag==1){ a[n++]=digit;digit=0;flag=0;} } cout<<"统计得含有整数的个...

【C语言】问题求助:输入一个字符串,内有数字和非数字字符,
答:return n; // 返回的是包含整数数值的个数 } int main(int argc, char* argv[], char* env[]){ int *pi = NULL;char str[MAXLINE] = {0};int n = 0, i = 0;printf("请输入一个包含整数的字符串:\n");gets(str);n = getNumber( str, pi );printf( "共包含 %d 个整数...

输入一个字符串,内有数字和非数字字符,
答:include "stdlib.h"void main(void){ char Str[100]="a123*456 17960??",flag=0,l=0,pA[10]={NULL,},ln=0;int Num[20],n=0,len;printf("请输入一个各种字符间隔等混合字符串!\nStr=");gets(Str);len=strlen(Str)+1;for(int i=0;i<len;i++){ if(flag && (Str[i]<...

c++输入字符串,内有数字和非数字字符,如a123*456将其中连续数字作为一...
答:include <iostream>#include <sstream>#include <vector>#include <algorithm>int* ParseInt(const char* s, int* len) { std::stringstream ss(s); int v; std::vector<int> r; for(;;) { if (ss >> v) r.push_back(v); else { char c; ss.clear()...