我想,每个人一开始遇到这个问题,都会觉得挺简单的。但真正实施的时候,可能就会觉得还是有点坑的。毕竟对于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. JavaScript toLocaleString() 方法

    JavaScript toLocaleString() 方法 JavaScript Array 对象 定义和用法 把数组转换为本地字符串. 语法 arrayObject.toLocaleString( ...

  2. Java—网络技术

    1  TCP Sockets基础 Sockets是一个编程抽象概念,它是网络上与另一个应用程序通信连接的句柄.Sockets编程将用户代码与TCP/IP协议堆栈的底层实现隔离开,允许用户灵活地实现自己 ...

  3. JavaScript中面向对象的的深拷贝和浅拷贝

    理解深拷贝和浅拷贝之前需要弄懂一些基础概念,内存中存储的变量类型分为值类型和引用类型. 1.值类型赋值的存储特点, 将变量内的数据全部拷贝一份, 存储给新的变量. 例如:var num = 123 : ...

  4. int unsigned实验

    create table t1(a int unsigned,b int unsigned); insert into t1 select 1,2; select 1-2 from t1; Error ...

  5. Leetcode 详解(Valid Number)

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  6. 在MyEclipse中配置Tomcat服务器

    http://wenku.baidu.com/link?url=j0rrOEvt10zgsJVWX3wuV26uVc2fz5MhIusvLWzvK_KZWMKq60wuDaMnHGck0PR6sCrU ...

  7. Cookie与Session用法

    以下是Cookie的完整实例 MyEclipse新建web Project工程,建两个jsp文件,如下 1.login.jsp <%@ page language="java" ...

  8. 两台装有Ubuntu系统的服务器搭建VPN(一台为本地服务器,另一台为云服务器)

    我们搭建VPN采用的是openvpn,搭建过程总体需要经过三大步骤:   1.openvpn的安装与配置    2.端口转发    3.系统重启iptables规则自动生效  注意:以下所有名令在ro ...

  9. 关于C#的内存释放问题

    最近在做一个要循环读取xml文件的功能. 想法是读取一个文件,释放一个文件,这样就不会消耗太多内存. 结果运行起来内存不停涨,最后内存溢出.用gc,disponse,异步都没有用. 后来改成relea ...

  10. python2.7安装matplotlib遇到的问题及解决方法

    python2.7下import matplotlib报错 第一个报错是:缺少这个pyparsing-2.1.4.win32-py2.7.exe 直接下载安装就行 第二个报错是:缺少cycler 这个 ...