c/c++下常用输入问题汇总

汇总一下在算法考试中常见的输入格式及处理方法,以防止出现明明算法是会的但由于输入问题处理不好导致题目没有答出,我就栽倒在这个问题上过。

一、几个常用的输入函数的异同

1. scanf()

需要包含头文件stdio.h。

scanf函数的返回值就是读入的变量的个数。

#include <stdio.h>

int main() {
    int a, b;
    int m = scanf("%d %d", &a, &b);
    printf("a = %d, b = %d, m = %d", a, b, m);
    return 0;
}

输入输出结果如下。


在这里,scanf函数规定了要输入两个变量,则一定要输完两个变量才可以进行下去,如果没输完两个变量,不管中间是按回车还是空格,都不会继续执行程序而是已知等待输入。这说明,scanf函数并不把回车和空格判定成一个输入。



scanf遇到空格、tab、回车都会判定结束。例如,如果只要求输入一个字符串但实际上输入了被空格分开的两个字符串,则只读入第一个。

#include <stdio.h>

int main() {
    char a[10];
    scanf("%s", a);
    printf("%s", a);
    return 0;
}

scanf也可以用来输入多个字符串,每个字符串之间用空格分开。

#include <stdio.h>

int main() {
    char a[10], b[10];
    scanf("%s %s", a, b);
    printf("%s\n%s", a, b);
}

与输入其他类型的数据时同样,scanf必须读够两个输入才会继续运行,两个输入之间的空格和回车都不算。

2. cin >>

需要包括头文件iostream和命名空间std。

#include <iostream>
using namespace std;

其他各项特点基本与scanf相同,但还是有一些细微的区别。可以参考这篇文章。由于从时间效率上,scanf比cin要快很多,所以我郑重在写算法题时使用scanf,常常有意想不到的效果。

3. c++中其他常用输入函数

补充:无回车不回显的输入方式
_getch()函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做小游戏,但是这个函数并非标准函数,要注意移植性!需要包括头文件conio.h。

二、常见输入输出情况汇总

1. 预先告知有N个输入块,接下来N行是这N个输入块的内容

计算A+B的值
输入描述:每一行整数N,接下来有N行输入,每行输入两个整型数字A和B,由空格分开,每组数字占一行。
输出描述:每个例子输出A+B单独作为一行。
输入样例
 2
 1 1
 4 4
输出样例
 2
 8

这是最简单的情况,没啥好说的,直接上代码。
c语法:

scanf("%d",&n) ;
for( i=0 ; i<n ; i++ ) {
  scanf("%d %d",&a, &b);
  printf(“%d\n”,a+b);
}

c++语法:

cin >> n;
for( i=0 ; i<n ; i++ ) {
  cin >> a >> b;
  cout << a+b << endl;
}

2. 输入时不说明有多少个输入块,但以EOF结尾

计算A+B的值
输入描述:每一行输入两个整数A和B,由空格分开。
输出描述:每个例子输出A+B单独作为一行。
输入样例
 1 1
 2 2
输出样例
 2
 4

补充:什么是文件结束符EOF
EOF是End Of File的缩写,是一个预定义的常数,值为-1。通常在文本的最后存在此字符表示资料结束。
以EOF作为文件结束标志的文件,必须是文本文件。因为在文本文件中,数据都是以字符的ASCII代码值的形式存放。ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。

c语法:

while (scanf("%d %d", &a, &b) != EOF) {
  ...
}

我写了这样一个程序。

#include <stdio.h>

int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) {
        printf("%d", a + b);
    }
}

结果如下。如果你是从控制台输入的话,每输入两个数字,按一下回车,就会输出一个结果。但问题是,程序会已知循环下去,不知道什么时候判定成输入结束。


如果我这样输入。一下子输入好几组数字,不使用回车,则每次循环会顺序往后读入两个输入,然后打印在屏幕上。但依旧不知什么时候判定成结束输入。


这是因为文件结束符是存在于文件输入的情况。如果你是控制台输入,没有手动输入文件控制符,自然不可能结束循环。

然而,ACM竞赛平台通常是从文本中进行数据输入的,因此会使用文件结束符EOF作为结束标志。因此在这类没有限定结束标志的问题中,直接判断是否读到文件结束符EOF就可以了。

c++语法:

while (cin >> a >> b) {
  ...
}

3. 输入时需要处理换行符

我曾经栽倒在这样的题目上过,明明算法很简单,但处理输入处理了半个多钟头。下面举个例子。

链表合并问题
输入描述:先输入一个非负数n,表示有n个链表。接下来输入n行,每行有若干个数字,中间用空格隔开,表示每一个链表。
输出描述:输出合并后的链表。

使用getchar()判断输入的字符是不是换行符'\n'。代码如下,只处理了输入问题,没有实现该题目的具体逻辑。

#include <stdio.h>
#include <vector>
using namespace std;

int main() {
    int N;
    scanf("%d", &N);
    vector<vector<int>> linklists;
    for (int i = 0; i < N; i++) {
        vector<int> llist;
        int num;
        do {
            scanf("%d", &num);
            llist.push_back(num);
        } while (getchar() != '\n');
        linklists.push_back(llist);
    }

    //打印上面输入的内容
    for (auto& a : linklists)
    {
        for (auto b : a)
            printf("%d ", b);
        printf("\n");
    }
    return 0;
}

这篇文章写起来不易,如果它对你有帮助的话,麻烦给个赞吧!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 浅谈C++常用输入输出 在编写C++程序的时候,经常因为输入输出头疼,所以在这里做一个小结,记录一下常用的输入输出...
    MinoyJet阅读 3,748评论 0 6
  • 1.输入不说明有多少个Input,以EOF为结束标志 (1)这里要说明的是如果输入 1 2 3 4 (回车),这时...
    nino天阅读 294评论 0 1
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,729评论 0 6
  • C语言的基本输入与输出函数 1.1.1 格式化输入输出函数Turbo C2.0 标准库提供了两个控制台格式化输入、...
    禄子_c79b阅读 1,370评论 0 1
  • 1. C++中各种输入输出函数总结 与输入输出流操作相关的类关系 2. 键盘输入输出函数 2.1. scanf函数...
    不学习不快乐阅读 538评论 0 0