c语言技巧(1)-标志量的使用(定位)

我们从一个问题引出这一话题。

问题:输入一个字符串,内有数字和非数字字符,例如:

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语言中,标志量的运用是很重要的一个小技巧,尤其对于一个数组来说,合理的运用标志量可以让我们准确的找出所需元素在数组中的位置,进而对目标进行转化。

     

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值