题目详情
输入一个字符串,内有数字和非数字字符,例如:“1A123x456 1794? 302tab1234a5” 将其中连续的数字作为一个整数,依次存放到一维数组a中。,例如,123存放在a[0]中,456存放在a[1]中,并统计有多少个整数,并输出。
以下是用C语言实现
//#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
/*
输入一个字符串,内有数字和非数字字符,例如:A123x456 1794? 302tab1234a5
将其中连续的数字作为一个整数,依次存放到一维数组a中。,例如,123存放在a[0]中,
456存放在a[1]中,并统计有多少个整数,并输出
*/
int main(void)
{
void count(char*,int[]);
int a[100];
char str[100] = "1A123x456 1794? 302tab1234a5";
//gets(a);
count(str,a);
return 0;
}
void count(char* str,int a[])
{ //i,j循环迭代,k统计数字个数,flag标记数字,begin标记起始位
int i=0,j=0,k=0,flag=0, begin, num=0, len;
len = strlen(str);
//printf("%d\n", len);
char* p = str;
while (i<=len)//将'\0'算入最后一位,如果不将'\0'算入,假如字符串最后一位是数字且为个位将无法读取
{
if (*(p + i) >= '0' && *(p + i) <= '9')
{
if (flag == 0)begin = i;//保存数字起始位
flag = 1;//数字标志
}
else {//说明当前指向不是数字,
if (flag == 1)//处理字符串数字,并且最后将需要迭代的值置0
{
for (j = begin; j < i; j++)
{//"123" 1*10+2 12*10+3 num = num*10+x
num = num * 10 + *(str + j) - '0';
}
a[k++] = num;
num = 0;
}
flag = 0;//数字标志置0
}
i++;
}
printf("总共有%d个数字:\n", k);
for (i = 0; i < k; i++)//输出所有数字
printf("%d ", a[i]);
}
运行结果:
++++++++++++++++++++++++下面是优化版本+++++++++++++++++++++++++++++++++
//#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define N 100
/*
输入一个字符串,内有数字和非数字字符,例如:1A123x456 1794? 302tab1234a5
将其中连续的数字作为一个整数,依次存放到一维数组a中。,例如,123存放在a[0]中,
456存放在a[1]中,并统计有多少个整数,并输出
*/
void split(char* s, int a[], int *k)
{
if(s==NULL||k==NULL){printf("data error!\n");return;}
int num, n;
num=0, n = 0, *k=0;
while (*s)
{
if (*s >= '0' && *s <= '9')//如果是数字,累加
{
num = num * 10 + (*s - '0');
}
else if((*(s-1) >= '0' && *(s-1) <= '9'))
{//如果当前位不是数字,并且前一位是数字,将num放入数组,然后置0
a[n++] = num;
num = 0;
}
s++;
}
if ((*(s - 1) >= '0' && *(s - 1) <= '9'))//当最后一位是数字时,直接将num放入数组
a[n++] = num;
*k = n;//通过指针返回长度
}
void print(int a[N], int n)
{
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
}
int main(void)
{
int a[N]={0}, k;
char str[N] = "1A123x456 1794? 302tab1234a5";
k = 0;
//gets(a);
split(str, a, &k);
printf("输出所有数字:\n");
print(a, k);
return 0;
}