问题描述:
输入一个字符串,内有数字和非数字字符,如:
a123x456 34x>302addfds46
要求将其中连续的数字作为一个整数,依次存放到数组a中。并输出这些证书。
源代码:
#include<stdio.h>
int a[10]; //定义全局数组
int find(char *str)
{ //将字符串str中证书放在数组a中,并返回证书的个数
int i=0,j=0,k,digit,m,e,num = 0;
while(*(str+i) != '\0')
{
if((*(str+i) >= '\0')&&(*(str+i) <= '9'))
j++;
else if(j>0)
{
digit = *(str+i-1)-48; //将连续数字的个数为赋予digit
k=1;
while(k<j) //若d连续数字个数大于2,将其他为数值累加与digit
{
e=1;
for(m=1;m<=k;m++)
e*=10;
digit +=(*(str+i-1-k)-48)*e;
k++;
}
a[num] = digit;
num++;
j=0;
}
i++;
}
if(j>0)
{
digit = *(str+i-1)-48;
k=1;
while(k<j)
{
e=1;
for(m=1;m<=k;m++)
e*=10;
digit += (*(str+i-1-k)-48)*e;
k++;
}
a[num] = digit;
num++;
}
return num;
}
void main()
{
char str[50];
int n;
printf("input a string:\n");
gets(str);
n = find(str);
printf("There are %d numbers in the string. They are:\n",n);
for(int i=0;i<n;i++)
printf("%d\t",a[i]);
}
上面的代码是书上的方法,我觉得十分繁琐和复杂,简单的问题复杂化了,但另一方面,更加锻炼了逻辑和算法。。。- -
源代码二:
#include <ctype.h>
#include <stdio.h>
int main ()
{
int i;
char str [ 256 ];
int a [ 20 ];
int num, alpha;
printf ( "input a string contains alnum\n" );
gets ( str );
for ( i = 0, num = 0, alpha = 1; str [ i ]; i ++ )
{
if ( isdigit ( str [ i ] ) )
{
if ( alpha )
alpha = a [ num ] = 0;
a [ num ] *= 10;
a [ num ] += str [ i ] - '0';
}
else if ( ! alpha )
{
num ++;
alpha = 1;
}
}
if ( ! alpha ) num ++;
printf ( "\n there is %d numbers:\n", num );
for ( i = 0; i < num; i ++ )
printf ( " %d\n", a [ i ] );
return 0;
}
这是选自百度一位老兄的,简单了许多,运用到了ctpye库中的函数。
源代码三:
#include<stdio.h>
#include<ctype.h>
int main()
{
int a[20];
char ch;
int i=0,j;
while((ch = getchar()) != '\n')
{
if(isdigit(ch))
{
a[i] = ch-48;
i++;
}
}
for(j=0;j<i;j++)
printf("%4d",a[j]);
return 0;
}
这是我后来写的,更加简洁了一些,当然输出结果略有些差异。