首页 > 代码库 > 如何用C保存一行未知个数的数字?

如何用C保存一行未知个数的数字?

同学做华为的上机题,问我这样一个问题,如何保存一行未知个数的数字?


首先想说的是,华为的上机题目真是坑爹啊,给个n告诉一下数字个数会死啊?他们下午做的题目还有一个是位复制的,输入和题目完全对应不上,真是不知道怎么出的题目,能不能学学code jam或者其他平台的题目,用点心好不好。


其次说说这个问题是怎么样的。


很多时候也许我们也会碰到这样的问题,知道输入时很多行,而且每一行都是有未知个数的数字,可能1个,2个,3个这样。我们现在不考虑把全部数据都读进来的情况,因为这样很简单,只需要用用个while(scanf)循环就可以,这样很简单。但是某企业就是这么坑爹,一行就是一个输入,需要处理,因此我们就来解决这样的问题。


就像下面这样的输入,我们要读取每一行,放到一个数组里面去

12 23 2323 23

123 23 

123 34 23

用简单的scanf我目前是没有想到什么好方法,那么能够想到的就是使用gets方法先把一行读取了再说。这样的话,可以写一段循环来自己解析这串字符串,每次读取一个char字符,保存到一个临时字符串数组,直到读到空格或者到字符串末尾(如果不用gets,也可以直接用getchar,这样就是判断是否遇到回车字符),然后把刚刚读取到的临时字符串使用atof转换为Double型数据。这样的代码也不难,但是还是需要自己小心的调试,我没有写,因为我发现在使用atof的时候发现了一个新的函数,叫做strtod。下面我就介绍如何用这个函数来读取我们的数字。


拷贝一段说明

strtod(将字符串转换成浮点数)
相关函数
atoi,atol,strtod,strtol,strtoul
表头文件
#include<stdlib.h>
定义函数
double strtod(const char *nptr,char **endptr);
函数说明
strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时(‘\0‘)才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。
返回值
返回转换后的浮点型数。
附加说明
参考atof()。
范例
/*将字符串a,b,c 分别采用10,2,16 进制转换成数字*/
#include<stdlib.h>
mian()
{
char a[]=”1000000000”;
char b[]=”1000000000”;
char c[]=”ffff”;
printf(“a=%d\n”,strtod(a,NULL,10));
printf(“b=%d\n”,strtod(b,NULL,2));
printf(“c=%d\n”,strtod(c,NULL,16));
}
执行
a=1000000000
b=512
c=65535

这个范例有点问题,什么时候多了第三个参数?不过先不管,简单说这个strtod有两个参数,一个就是待转换的字符串指针,这个没话说,还有一个是endptr,它指向不符合转换条件的字符串指针,比如有个字符串char* p = “123 23”,如果传入p,我们知道123后面是个空格,不能转换为数字,因此这个函数会转换123,然后返回123,但是在endptr中它是指向这个空格的,因此我们利用这个函数就可以大大简化我们的方法。


放出代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int main(){
	double a[100];
	char line[500];

	int pos = 0;
	while(gets(line)){
		double tmp;
		
		char* p = line;
		while(*p!='\0'){
			tmp = strtod(p,&p);
			a[pos++]=tmp;
		}
		
		for(int i=0;i<pos;i++){
			printf("Num%d: %lf\n",i,a[i]);
		}
		
		pos=0;
		
	}
		
	return 0;
}

简单说,先读取一行字符到line中,然后用p指向line,接着循环读取数字,因为我们知道line的最后一个不能转换为数字的字符肯定是‘\0‘因此用这个作为结束条件进行循环,循环内部就是strtod(p,&p),注意因为这个endptr是个指针的指针,因此我们传的是p的地址,这样才能够更新p的值,每次读取一个数字,就会更新p的位置,这样就实现了简单的单行未知数字的读取,是不是很简单。