我想,每个人一开始遇到这个问题,都会觉得挺简单的。但真正实施的时候,可能就会觉得还是有点坑的。毕竟对于C/C++这样成熟而使用广泛的语言而言,对于这个简单的问题竟然没有一个简洁有力甚至一行代码的解决方案,依然是让人觉得挺震惊的。

在 C/C++ 中,由于整数读取通常是会忽略空格、制表符、换行符等等的,所以当一行整数为不定数目的读取时,事情就变得有点棘手了。

由于对换行符的忽略,你无法判断此时行是否结束。

在C++中,我们通常可以直接把 cin 读取的返回作为条件判断以此来判断输入是否成功,不成功则不再继续 cin 从而退出循环,来完成对不定数目数据的读入。

一开始可能会这样想:while (cin >> a[n++]);

然后正如上述对换行符的忽略,换行之后 cin 并没有 fail (可参考 cin.fail() 方法)。

然后可能会有如下想法:

 int temp;
while (true)
{
cin >> temp;
if (temp == '\n') break;
a[n++] = temp;
}

但依然不行。因为数据中很可能有与 '\n' ASCII 码相同的整数值,如果此时就 break 这样读入的数据不完整了。

然后我开始查找和提问,具体可参考下述链接的问题和讨论:

http://segmentfault.com/q/1010000002782266

事实上,c++ 强大的支持是完全可以用已有的功能解决的,实在不行大不了总是可以读入字符串再解析的嘛~

具体可以由上述链接中的答案,参考 sstream 和 sscanf。

并且,c++标准库本身就重载了istream& operator>> (istream& (*pf)(istream&));,让用户自行处理一些特殊的input需求。

然而对于一个初入C++坑的骚年而言,这些我依然觉得不熟悉不简明。

再继续检索了一些网上的内容之后,还是用一个类C的方式,解决了这个问题。

用到字符串,同时解析数字部分直接交给sscanf函数解决。既可以理解又保持简洁,让问题不至于过于深究了。

方案如下:

 #include <string>
#include <iostream>
using namespace std; char buffer[];
char* p = buffer; gets(buffer);
while (*p != )
{
// 过滤空格与缩进
while (*p == ' ' || *p == '\t') p++; // 读整数
if (sscanf(p, "%d", &a[n++]) == ) break; // 偏移指针到非数字部分
p++;
while (*p >= '' && *p <= '') p++;
}

其中 a 是存储整数的数组,n是其下标,最终也是整个数组的长度。

C/C++读入一行不定个数的整数的更多相关文章

  1. scala 学习笔记(03) 参数缺省值、不定个数参数、类的属性(Property)、泛型初步

    继续学习,这一篇主要是通过scala来吐槽java的,同样是jvm上的语言,差距咋就这么大呢? 作为一个有.NET开发经验的程序员,当初刚接触java时,相信很多人对java语言有以下不爽(只列了极小 ...

  2. 在JS中如何判断所输入的是一个数、整数、正数、非数值?

    1.判断是否为一个数字: Number(num)不为 NaN,说明为数字 2. 判断一个数为正数: var num=prompt("请输入:"); if(Number(num)&g ...

  3. C++ 输入一行未知个数的整数

    C++ 输入一行未知个数的整数 代码: #include<iostream> #include<vector> using namespace std; int main() ...

  4. 编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示

    编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示 效果如下: 实现代码: import java.util.Arrays; import java.util.Scanne ...

  5. c/c++ 读入一行不确定个数的整数

    假设有一个文件,文件的每一行包括n个整数,整数之间以一个空格隔开,文件总共有m行,但是事先不知道n,m.如何每次从文件中读取一行整数放到一个数组中. 可以分为两步:1.首先从文件中读入一行字符串,2. ...

  6. SQL判断一个数是整数还是小数

    DECLARE @number1 AS numeric(10,2),@number2 AS numeric(10,2) SELECT @number1=10.00,@number2=10.2 SELE ...

  7. sql中,如何获取一个数的整数部分和余数部分

    我们测试一下,我要得到的结果是多少周(整数),多少天(余数) 1.获取指定日期到当前日期之间的天数 首先用DATEDIFF() 函数获取指定日期到当前日期的天数 --获取指定日期到当前日期的天数 se ...

  8. PHP取不定个数数组交集

    最近有个需求,有一个N个二维数组,N是动态的,不固定个数,现需取这N个数组的交集内容. 用到的函数是array_intersect_assoc 用法 $result_arr = array_inter ...

  9. python 判断一个数是整数还是小数

    a=81**0.5 s=str(a).split('.') if float(s[1])==0: print('整数') else :print('小数')

随机推荐

  1. D​e​p​l​o​y​m​e​n​t​ ​f​a​i​l​u​r​e​ ​o​n​ ​T​o​m​c​a​t​ ​6​.​x​.​ ​C​o​u​l​d​ ​n​o​t​ ​c​o​p​y​ ​a​l​l​ ​r​e​s​o​u​r​c​e​s​ ​t​o

    在myeclipse总部署项目,一直有问题,提示如下的错误,经过研究在网上需求帮助,解决方案如下: Deployment failure on Tomcat  6.x. Could not copy  ...

  2. Linux下面CentOS 7桌面的安装

    搭建本地yum仓库的方法 http://www.cnblogs.com/lql123/p/5952788.html 1.yum grouplist #列出yum仓库里的软件组列表 2.yum grou ...

  3. 转:spl_autoload_register与autoload的区别详解

    转:http://www.poluoluo.com/jzxy/201306/209614.html spl_autoload_register(PHP 5 >= 5.1.2)spl_autolo ...

  4. Python模块学习笔记

    1.作用域 私有private:用'_x'或'__xx'表示,如,_a,__ab; 公有public: 如 a,b; 特殊变量,可被直接引用,如:__author__,__name__,命名变量时一般 ...

  5. Android版本

    Android自从3.0版本开始引入了Fragment的概念,它可以让界面在平板上更好地展示   Fragment建议继承android.app.Fragment的包,另外support.v4包主要是 ...

  6. mongodb 使用场景和不使用场景

    1.mongodb介绍 MongoDB (名称来自"humongous") 是一个可扩展的高性能,开源,模式自由,面向文档的数据库.它使用C++编写.MongoDB特点: a.面向 ...

  7. EasyUI表单内容整理

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 关于sysprocesses表各字段的作用

    sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息.这些进程可以是客户端进程或系统进程.sysprocesses 只存储在 master 数据库 ...

  9. thunkify 模块

    function thunkify(fn){ assert('function' == typeof fn, 'function required'); return function(){ var ...

  10. ROS语音交互——科大讯飞语音合成TTS(二)

    之前我用过科大讯飞的语音包,为了记录一下我重新使用一下 首先注册科大讯飞账号及应用,以后每个下载的在线使用SDK都是以此账户ID登录讯飞语音服务器. 下载科大讯飞在线合成包. $ unzip Linu ...