如何從標準輸入讀入數據(2) -- c++語言

注意: 博主將持續更新此文檔, 直到文尾的 <未完待續> 標記清除 ios

輸入要考慮的基本問題

算法競賽題目通常會有多個測試用例,採用重定向的方式把數據送給程序。
而後觀察程序的輸出是否和預期的結果一致。
多數狀況下,這些測試用例會以文件的形式存在。這就要注意如下的問題:c++

  1. 每一行的數據有多項,其分隔符不是徹底肯定,好比是:一個或多個空格。
  2. 每一行上的數據有多少項可能不知道。一直持續到本行結束。
  3. 一共有多少行可能不知道,一直到文件尾。
  4. 最後一行可能沒有回車換行符,直接遇到 EOF (文件結束標記)
  5. 在不一樣的操做系統下,換行的方式可能不一樣。
  6. 在提供字符串的時候,可能含有空格。

下面咱們舉一些最多見的例子。算法

若干行,每行一個整數

測式數據測試

3
5
-7
9

因爲c++的類庫封裝很好,這能夠很簡明地處理以下:spa

#include <iostream>
using namespace std;

int main()
{
    int n;
    while(cin >> n){
        cout << n << endl;
    }
    
    return 0;
}

在不一樣平臺上,最後一行有沒有回車,分隔符是1個空格仍是多個空格都很好地被考慮了。操作系統

若干行,每行兩個整數,用一個或多個空格分開

測試數據code

10 20
30   40
50 60

注意,每一個整數後面多是1個或多個空格,也多是回車符,也可能先是空格再接着一個回車符
最後一行最後一個整數後也可能什麼都沒有,直接撞上EOF標記。ci

#include <iostream>
using namespace std;

int main()
{
    int a,b;
    while(cin >> a >> b){
        cout << a << "," << b << endl;
    }
    
    return 0;
}

先是讀入一個整數n,後面緊跟着n行字符串(串中可能含有空格)

測試數據文檔

3
I am a student
test string
ok

注意,用 scanf 確定是不行的,由於遇到了分隔符就會返回了,不能讀入完整的串。字符串

#include <iostream>
using namespace std;

int main()
{
    const int MAXN = 1000;
    char str[MAXN];
    
    int n;
    cin >> n;
    cin.getline(str,10);   // 這個空讀重要,由於在讀整數的時候不會吃掉所遇的分隔符。
    
    for(int i=0; i<n; i++){
        cin.getline(str, MAXN);
        cout << str << endl;
    }
    
    return 0;
}

<未完待續>

相關文章
相關標籤/搜索