2011-11-19 20 views
5

我的輸入格式像這樣的字符串:閱讀與整數一條線,用空格

整數多詞串整數

我知道多字的最大lenght -string,但是我不知道它包含多少個單詞。我如何閱讀它?

+0

一次讀取一行,您可以構建一個子字符串解析器,然後您可以使用各種任意終止符來枚舉這些段。 Kerrek的答案很好,但如果你需要經常做這類事情,而且你需要一個通用的高效工具,那麼我發現這種方法對我們來說最合適 – Mordachai

回答

1

讀取第一個整數。跳到字符串的後面並跳過數字。然後從這一點讀取一個int。中間的部分是字符串。可能不是100%正確的,但:

char buf[256], *t = buf, *p, str[256]; 
fread(buf, 1, 256, file); 
int s,e; 
t += sscanf(buf, "%d", &s); 
*p = buf + strlen(buf); 
while (isdigit(*p)) p--; 
sscanf(p, "%d", &e); 
strncpy(str, p, p - t); 
5

我會先讀出行並將第一個和最後一個單詞轉換爲整數。鬆散:

std::string line; 
std::getline(infile, line); 

size_t ofs_front = line.find(' '); 
size_t ofs_back = line.rfind(' '); 

int front = std::strtol(line.substr(0, ofs_front).c_str(), NULL, 0); 
int back = std::strtol(line.substr(ofs_back).c_str(), NULL, 0); 
std::string text = line.substr(ofs_front, ofs_back - ofs_front); 

你必須做一些修改,以擺脫空間(如增加偏移吞噬所有空格),你應該添加了很多錯誤檢測的。

如果你想正常化所有內部裏面的文字空間,那麼還有另一種解決方案使用字符串流:

std::vector<std::string> tokens; 
{ 
    std::istringstream iss(line); 
    std::string token; 
    while (iss >> token) tokens.push_back(token); 
} 
// process tokens.front() and tokens.back() for the integers, as above 
std::string text = tokens[1]; 
for (std::size_t i = 2; i + 1 < tokens.size(); ++i) text += " " + tokens[i]; 
1

這並不像@ KerrekSB的solution一樣高效,但另一種方式來做到這一點是提取第一個整數,然後遍歷字符串的其餘部分,直到找到第二個整數。

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::istringstream ss("100 4 words to discard 200"); 
    int first, second; 
    char buf[1000] = {0}; 

    if(!(ss >> first)) { 
    std::cout << "failed to read first int\n"; 
    return 1; 
    } 

    while(!(ss >> second) || !ss.eof()) { 
    if(ss.eof()) { 
     std::cout << "failed to read second int\n"; 
     return 1; 
    } 
    ss.clear(); 

    if(ss.getline(buf, 1000, ' ').bad()) { 
     std::cout << "error extracting word\n"; 
     return 1; 
    } 
    }  

    std::cout << "first = " << first << "\n"; 
    std::cout << "second = " << second << "\n"; 

    return 0; 
} 
+0

@KerrekSB這兩種情況都可以正確處理 – Praetorian

+0

對不起,沒關係! –