C语言。输入一个字符串,内有数组和非数字字符,将其中连续的数字作为一个整数,依次存放到一数组a中

输入一个字符串,内有数组和非数字字符,例如
A123x56 17960?302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中,例如123放到a[0],456放在a[1]......统计有多少个整数,并输出这些数。

我这样写哪里出问题了呢?
#include <stdio.h>
void main(){
char s[]="A123x56 17960?302tab5876";
char a[10]={0};
char *p=s,*q=a;
int i=0,sum=0;

while (*p){
if (*p>='0' && *p<='9')
{

a[i]=a[i]*10+(*p-'0');//a数组存放字符串中的数字,如果数字字符连续出现,则a数组的下标不变。
p++;
sum++;//计算数字个数
}
else if (sum>0)//如果数字个数大于0,*p又是非数字字符
{
sum=0;
i++;
p++;
}
else if(sum==0) p++;
}
for(i=0;i<10;i++)
printf("a[%d]=%d\n ",i,a[i]);
}

输出

#include <stdio.h>

#include <math.h>

void output(char *s, int n);            //定义输出函数

int main()

{

char str[30];

printf("Please enter string: ");    //输入字符串

gets(str);

output(str, 30);                    //调用输出函数

return 0;

}

//输出函数

void output(char *s, int n)

{

char *i;

int j, k, t, m, temp[10], num;

double sum, a[30];

for (i=s, num=0, j=0, m=0; i<s+n; i++)

if (*i>='0'&&*i<='9') num=1, temp[j++]=(int)(*i-'0');

else if (num){

for (num=0, k=0, sum=0, t=j-1; k<j; sum+=temp[k]*pow(10, t), t--, k++);

a[m++]=sum, j=0;

}

for(j=0, printf("There is %d number in the string.\nResult: ", m); j<m; printf("%.0f ", a[j++]));

printf("\n");

}

扩展资料:

printf()函数用法:

printf()函数的调用格式为:printf("&lt;格式化字符串&gt;",&lt;参量表&gt;)。

其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。

比如:

int a=6789;

printf("a=%d\n",a);

输出结果为a=6789。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-23
void search(char *p1,double *p2,int *p3)
{
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用于记忆连续检测到的整数个数
}
/* //1. 修改
else if(i!=0)//当遇到字符串中的一个非整数的字符时,执行以下操作
{
for(h=0;h<j;h++)
sum=pow(10,double(a[h]))+sum;//计算之前检测到的整数
*/
else if(j!=0)
{
for(h=j-1;h>=0;h--)
sum+=(a[j-h-1] - '0')*pow(10,double(h));//计算之前检测到的整数

*(p2+n)=sum;//将之前得到的这个数存入数组*(p2+n)即num[]数组
sum=0;//将sum归零,以便下一次检测到整数时再使用
n++;//n自加1以方便下次存储检测到的整数
j=0;//将j归零以方便下一次检测到整数时进行记忆
}
else continue;//如果字符串中的第一个字符就不是整数,
} //那么就直接跳出本次循环进行下一个字符的检测

// 2. 增加
if (j != 0)
{
for(h=j-1;h>=0;h--)
sum+=(a[j-h-1] - '0')*pow(10,double(h));//计算之前检测到的整数

*(p2+n)=sum;//将之前得到的这个数存入数组*(p2+n)即num[]数组
n++;
}

/*// 3. 修改
*(p3)=n+1;//记忆检测到的整数个数,“传回”主函数
*/
*(p3)=n;
}

对你的代码做了3处修改。分别说明如下:
1. 判断条件的修改,原条件无法判断两个数字中间的非字符数大于1的情况
循环变量h由递增改为递减,因为数组a中,下标从小到大分别表示的是从高位到低位,比如123保存在a中,那么a[0]保存的是百位
增加了一个乘法,因为pow只能计算该位置的单位,而不能表示具体数值,比如321,pow只能计算出100 + 10 + 1
为什么要减去'0',因为a中保存的是字符,而不是整数。
2. 增加了一次循环,如果字符串不是以非数字字符结尾,那么,最后一次读到数组a中的数据则无法u取出
3. 函数第三个参数的赋值修改为n而不是n+1,每次读完一个数字,n自动完成了加1,因此最后无需再对其进行加1操作
第2个回答  推荐于2017-12-15

if (*p>='0' && *p<='9') 

{

a[i]=a[i]*10+(*p-'0');//a数组存放字符串中的数字,如果数字字符连续出现,则a数组的下标不变。

p++;

sum++;//计算数字个数

}

这一段中连续数字字符每处理一个就sum++;了,按要求是一个整数sum增1一次;char a[10]={0};这个声明也有问题,a的元素只有1字节,绝大多数整都放不下。所以再没有往下看,写得也太复杂,下面提供一个作参考……

//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "string.h"
int main(void){
    char s[]="A123x56 17960?302tab5876";
    int a[1000],i,j,k,ln=strlen(s);
    for(j=k=i=0;i<ln;i++){
        sscanf(s+i,"%d%n",&a[j],&k);
        if(k) j++;
        i+=k;
        k=0;
    }
    printf("Found %d integer(s) in the string:\n",j);
    for(k=0;k<j;printf("%-10d",a[k++]));
    printf("\n");
    return 0;
}

本回答被提问者和网友采纳
第3个回答  2015-05-10
char cMix[100]="sdf34534hjkljk56365jhl huo4578bhj45t";
char *pChar=cMix;
int Integer[10][16];//最多只能10组数字,每组最多15个数字字符。
int j,i=0;//整数数组下标
while(*pChar)//混合字符串未结束
{ if(!isdigit(*pChar)) //*pChar不是数字
{pChar++; continue;}
j=0;//新组第一个数字
while(isdigit(*pChar)&&j<14)//*pChar是数字&&j<14
{Integer[i][j++]=*pChar; pChar++;}
Integer[i][j]='\0' ;//字符串结尾标志
i++;//准备下一个数字组
}