输入一个字符串,内有数字和非数字字符,

2024-11-07 12:37:21
推荐回答(3个)
回答(1):

给出一段C/C++代码,希望有帮助。
#include "stdafx.h"
#include "stdio.h"
#include "string.h"//
#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 if(flag && (Str[i]<'0' || Str[i]>'9')){
Num[ln++]=atoi(pA);
flag=0;
strset(pA,NULL);
l=0;
n++;
}
else if(Str[i]>='0' && Str[i]<='9'){
pA[l++]=Str[i];
flag=1;
}
}
printf("\n整数有%d个,它们是:",n);
for(i=0;i printf("\n");
}

回答(2):

#include
#include
#include
using namespace std;

//因使用了string,cin,cou,vector,c无法编译
//一个简单的算法,对于字符串,设定一个指针,程序中的start
//第一个while循环查找直到是字符0-9之间的数,找到以后,使用atoi转换为数字存入vector中
//第二个while循环查找知道不是字符0-9的数字,即跳过刚转换过的字符,继续查找,直到找完
void fun(vector &vInt, const string &str)
{
int len = str.length();
int start=0;
while (start {
if (str.at(start)>='0' && str.at(start)<='9')
{
vInt.push_back(atoi(str.substr(start,str.length()-start).c_str()));
while(start {
if(str.at(start)<'0' || str.at(start)>'9')
break;
start++;
}
}
start++;
}
}

int main(int argc, char* argv[])
{
string str;
vector vInt;
cin>>str;
int len = str.length();

fun(vInt,str);

cout<<"整数个数: "<< vInt.size()< for (int i=0;i {
cout< }

return 0;
}

回答(3):

#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:"< gets(str);
cout< 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 {
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[0];
for(j=0;j cout<<*(pa+j)< cout< 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:"< gets(str);
cout< 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 cout<<*(pa+j)< cout< return 0;
}