提取字符串中的数字

题目详情


输入一个字符串,内有数字和非数字字符,例如:“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;
}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值