如何用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的位置,这样就实现了简单的单行未知数字的读取,是不是很简单。

如何用C保存一行未知个数的数字?,布布扣,bubuko.com

时间: 2024-12-20 18:07:57

如何用C保存一行未知个数的数字?的相关文章

c语言输入一行未知个数数字存入数组

一直有个疑问输入一行数字存入数组时若不知道数字的个数怎么办,最容易想到的办法就是接收字符然后转化为数字,但这样太过麻烦. 今天上网查了下,说可以用ungetc()函数将字符送回输入流,在这里总结归纳一下 此外还意外的解决了另外一些以前遇到的问题,也是在调试代码时发现的,用此段代码可以用除了空格以外的字符作为分隔符,而且分隔符的长度也可以很长:如输入12qwertyuiop34asdfghjkl123,23zxc45  最后得到的数组为:a[0]=12,a[1]=34,a[2]=123,a[3]=

c++连续读取未知个数的数字

#include <iostream> using namespace std; int main() { int n; int a[100]; int i=0,count=0; while(cin>>n){ a[i] = n; count++; i++; if (getchar() == '\n') break; } for(int j=0;j<count;j++){ cout<<a[j]<<" "; } } 重点是 if (ge

输出是一个文本文件,每一行第一个数字式行标,第二个数字是输入文件中每一行除行标外数字的平均值

有时候你会遇到这样的问题:你有一个表格,给出了每个人在十二月,一月和二月的收入. 表格如下: 姓名 一月 二月 三月 楚乔     200   314   3500 宇文玥     2000  332   2300 烟熏柿子    6000  333   680 淳儿    5000  333   789 洛河     30    12    2900 现在需要知道每个人这三个月的收入平均值,那么你就需要将表格中一行代表收入的数字相加除以月数.下面请编写MR程序解决这个简单的问题. 输入只包含一

c++实验5--统计输出字符串中(大/小写)字母个数,数字个数及其它字符个数。

一.问题及代码 /* * 文件名称: * 作 者: 杨楚莛 * 完成日期: 2016 年 5 月 3 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:统计输出字符串中(大/小写)字母个数,数字个数及其它字符个数. * 输入描述: * 问题描述: * 程序输出: * 问题分析: * 算法设计: */ #include<iostream> #include<cstdio> using namespace std; int main() { char str[50]; in

实现每一行4个数输出1000到2000之间的闰年

这个代码弄了几个小时,最后终于有了思路. 其实之前就有想法,不过基础学的还不够好,所以对于每次找到一个闰年一次之后就给一个变量的值+1的想法老是实现不了, 最后知道可以先初始化一个变量,在for()循环之前就定义,然后在if条件里实现count++:(等于每找到一个符合if条件的语句,就给这个变量加上一),然后在这个变量是4的倍数的时候进行换行,就相当于是每行4个数. JS代码如下: <script type="text/javascript">var a =1000;va

如何用取尺法处理连续区间内数字相同

经常会遇到类似下面这种问题: 给你n个数,由0和1组成,问1或者0的最大连续长度是多少 110001101的最大连续长度就是中间3个连续的0,所以是3 这里稍微总结出了一个取尺法,以后遇到这样的题目就不需要再思考太多细节了 int L, R = 1, ans = 0; for(L = 1; L <= n; L = R + 1) { for(R = L; R + 1 <= n && B[L] == B[R + 1]; R++); ans = max(ans, R - L + 1)

jquery 字符个数(数字字母长度记为1,中文记为2,超过长度自动截)

<script type="text/javascript">  //返回val的字节长度  function getByteLen(val) {  var len = 0;  for (var i = 0; i < val.length; i++) {  if (val[i].match(/[^\x00-\xff]/ig) != null) //全角  len += 2;  else  len += 1;  }  return len;  }  //返回val在规定

计算不确定数字个数的数字总和

#include<stdio.h>int main(){     int m,n,i,sum;     scanf("%d",&m);     for(i=1;i<=m;i++)     { sum=0;      while(1) {        scanf("%d",&n);        sum=sum+n;        if(getchar()=='\n')break; }      printf("%d\n&

如何用谷歌浏览器导出一个https网站的数字证书

HTTPS加密是互联网安全建设的基础,百度.淘宝.天猫等越来越多互联网巨头启用全站HTTPS,也带动了更多网站加入HTTPS加密的行列.普通用户也逐渐明白HTTPS比HTTP更安全,访问网银.购物等重要网站时要先观察是否有HTTPS加密保护. 但是在日常访问过程中,用户可能会发现有些网站HTTPS是绿色.有些却是红色,有些显示安全锁.有些却显示叹号.由于浏览器品牌不同.版本不同,对于HTTPS安全状态的标识符号也有些不同,让不少用户有点摸不着头脑.本文汇总介绍最新版本浏览器HTTPS不同状态的显