同学做华为的上机题,问我这样一个问题,如何保存一行未知个数的数字?
首先想说的是,华为的上机题目真是坑爹啊,给个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的位置,这样就实现了简单的单行未知数字的读取,是不是很简单。
如何用C保存一行未知个数的数字?,布布扣,bubuko.com