OJ的IO問題(二)

??途W(wǎng)提供了一個 OJ在線編程常見輸入輸出練習(xí)場,里面包含了常見的數(shù)據(jù)輸入輸出格式要求,如果能夠掌握這個練習(xí)場的習(xí)題,以后一般不會在輸入輸出問題上耗費(fèi)大量時間了。以下對這個練習(xí)場的習(xí)題做個總結(jié)。

A+B(1)~(5)字符串排序(1) 相對簡單,輸入數(shù)據(jù)的行數(shù)和每行的數(shù)據(jù)個數(shù)都是直接或間接給定的,循環(huán)即可。

A+B(6) 是的輸入數(shù)據(jù)行數(shù)是不確定的,但是每行的數(shù)據(jù)個數(shù)間接都由第一個數(shù)據(jù)給定。

// A+B(6)
#include <iostream>

int main()
{
    int count;

    // 當(dāng)數(shù)據(jù)讀完,輸入流的狀態(tài)變?yōu)?false
    while (std::cin >> count) {
        int num, sum = 0;
        while (count--) {
            std::cin >> num;
            sum += num;
        }
        std::cout << sum << std::endl;
    }

    return 0;

A+B(7)字符串排序(2) 類似,數(shù)據(jù)行數(shù)是不確定的,每行的數(shù)據(jù)個數(shù)也是不確定的,這種情況可以選擇每次讀取一行,按行處理數(shù)據(jù),使用字符串輸入流的格式化輸入簡化數(shù)據(jù)處理。

// A+B(7)
#include <iostream>
#include <sstream>
 
int main()
{
    int num, sum;
    std::string line;
 
    // 第一個數(shù)據(jù)用格式化輸入處理,數(shù)據(jù)讀完的話自然就退出了
    while (std::cin >> sum) {
        std::getline(std::cin, line);
         
        // 每次初始化一個 iss
        // 不要通過 istringstream::str 去復(fù)用同一個 iss
        std::istringstream iss(line);
         
        while (iss >> num) {
            sum += num;
        }

        std::cout << sum << std::endl;
    }
     
    return 0;
}

最后是 字符串排序(3),它除了數(shù)據(jù)行數(shù)不確定、每行數(shù)據(jù)個數(shù)不確定之外,每個數(shù)據(jù)之間并不是空白字符(如空格、制表、回車、換行等),而是另外自定義的特殊字符。間隔符不是空白字符導(dǎo)致的后果是,不能直接使用流對象的格式化輸入輸出操作符去格式化讀取數(shù)據(jù)。這里的解決方式是每次讀取一行字符串,用該字符串構(gòu)建字符串輸入流,用字符串輸入流的非格式化輸入接口定制間隔符,從而讀取每一個字符串?dāng)?shù)據(jù)。

// 字符串排序(3)
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
 
int main()
{
    std::string line;
    std::string str;
    
    while (std::getline(std::cin, line)) {
        std::istringstream iss(line);
        std::vector<std::string> strs;
        
        while (std::getline(iss, str, ',')) {
            strs.emplace_back(std::move(str));
        }
        
        if (strs.empty()) continue;
        
        std::sort(strs.begin(), strs.end());
        
        for (auto it = strs.begin(); it != strs.end() - 1; it++) {
            std::cout << *it << ',';
        }
        std::cout << strs.back() << std::endl;
    }
 
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容