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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入一个字符串,内有数字和非数字字符。相关的知识,希望对你有一定的参考价值。

如:a123x456+-_1234?3ki34jkk
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456放在a[1]--统计共有多少个整数,并输出这些数。
#include<iostream>
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;//??
k=1;//k代表什么
while(k<j)
e10=1;//e10代表什么
for(m=1;m<=k;m++)
e10=e10*10;//??
digit=digit+(*(pstr+i-1-k)-48)*e10;
k++;

*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<iostream>
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<iostream>
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;
参考技术A 你想说什么 ?追问

注释

参考技术B 表示 很纠结```追问

你都不会啊

追答

这是C 当然只有遍历整个字符串,如果是可以使用正则表达式的语言 如.net c++ java 那就简单多了```两句代码就可以解决问题

追问

我这个是c++来的,我还在c++边徘徊还没有走进去。
digit=*(pstr+i-1)-48;//你可以帮我解释一下这个是什么意思吗

追答

看代码真是头疼呀....
pstr 应该是字符串的首地址吧.
pstr+i-1 就是当前遍历到的字符地址 然后用* 取值(取到的是一个字符) 再将得到的值减48 如果是一个字符与数字相减 那么系统将会用此字符的ascII码值来作减法操作.. 具体是干啥的 我也不清楚了哈``

追问

pstr是字符串首地址,pstr+i-1我理解的是指向字符的前一位。

字符型怎么判断是否数字和字母?

参考技术A

1、可以用sacnf或gets函数直接接收输入的字符串,然后用循环遍历字符串中每一个字符,判断其是字母还是数字。

2、可以用循环调用getch()或getchar()函数来一个一个字符的接收输入,同时判读输入的是字母还是数字。

3、假设字符c,满足 (c>='a'&& c<='z')|| (c>='A' && c<='Z')就是字母,满足 (c>=0 && c<=9)就是数字。

扩展资料:

getch():

所在头文件:conio.h

函数用途:从控制台读取一个字符,但不显示在屏幕上

函数原型:int getch(void)

返回值:读取的字符

例如:

char ch;或int ch;

getch();或ch=getch();

用getch();会等待你按下任意键,再继续执行下面的语句;

用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。

参考资料来源:百度百科-getch()

以上是关于输入一个字符串,内有数字和非数字字符。的主要内容,如果未能解决你的问题,请参考以下文章

c++ 怎样提取一个字符串中的连续数字并放到另一个数组中保存? 急!

数字+空格字符串(信用卡号)的移动友好输入

C语言的一道题,急求解。

python 计算数字中的每个数字和非间隔字符串中的每个字母。将它们分组为字典并打印字典。

使用 gsub 在字符串中仅保留字母数字字符和空格

c语言编程求助