我们从一个问题引出这一话题。
问题:输入一个字符串,内有数字和非数字字符,例如:
A123x456 17960?302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。
对于这个问题,有两个核心要解决的问题:
1、如何实现字符数组向整数数组的转化。
2、运用什么技巧在一行字符中找到数字字符并判断是否连续整数。
与人一眼就能识别数字的位置不一样的是,机器并不能直接看出数字在哪里。因此,在c语言中,我们往往运用标志量来进行定位
解决该题的代码如下
#include<stdio.h>
#include<string.h>
int exchange(char a[],int length);
int main(void)
{
int i,j;
int number_count=0; //用于统计整数个数
int begin=0,end=0,length=0; //用于定位
int a[100]; //用于存放整数
char str[100] = {'\0'},number[][100]={'\0'}; //一个用于存放原始字符串 另一个用于存放找到的连续整数字符
printf("请输入一个字符串:\n");
gets(str); //输入字符串
for (i = 0; i<strlen(str); i++)
{
if(str[i]>='0'&&str[i]<='9') //发现到数字字符串
{
end=begin=i; //标记字符串位置
for(j=begin; ;j++)
{
end++;
if(str[j]<'0'||str[j]>'9')
{
end-=2;
break; //定位整数字符串的末位置
}
}
length=end-begin+1; //标记该整数字符串长度
if(length>=2) //若字符串长度为2及以上,则是连续数字
{
int k,p=begin;
for(k=0;k<length;k++)
{
number[number_count][k]=str[begin]; //首先将这个连续数字存入到用于存放数字的字符串中
begin++;
}
a[number_count]=exchange(number[number_count],length); //调用函数将字符串转化为整数
number_count++; //统计连续数字个数
i=end+1; //重新定位,从这个数字后一位重新开始寻找连续数字
}
}
}
printf("连续整数的个数有%d个\n",number_count); //输出连续数字的个数
if(number_count>=1)
{
printf("分别为:\n");
{
int i;
for(i=0;i<number_count;i++)
printf("%d\t",a[i]); //输出这些连续数字
printf("\n");
}
}
system("pause");
return 0;
}
int exchange(char a[],int length) //定义一个函数,用以将连续数字字符串转化为整数
{
int number=0;
int i;
for(i=0;i<length;i++)
{
number=number*10+(a[i]-'0');
}
return number;
}
在代码中,begin和end就是两个标志量。这里运用了begin来定位每个数字的第一位位置,end定位每个数字的最后一位数字的位置。第一个循环遍历整个字符串时,当发现数字时,立刻用begin和end定位,然后从这个数字开始向后推移判断是否为数字,发现最后一个数字时,用end定位这一位置,这就锁住了这一个连续数字的字符。在将这个字符转化为整数存储到a数组后,后最后一个数字开始继续遍历数组,直至找出所有的连续整数。
需要注意的是,对于一个循环来说,一种标志量的运用需要在每一次循环开始时重新赋值,而另一种标志量的运用需要保留原来值,继续用于遍历数组。标志量的使用方法还有很多,如用于计数,用于筛选,(以后会继续阐述)具体如何运用,需要读者自己研究程序,找出标志量的运用方法。
小结:在c语言中,标志量的运用是很重要的一个小技巧,尤其对于一个数组来说,合理的运用标志量可以让我们准确的找出所需元素在数组中的位置,进而对目标进行转化。