2010-03-06 46 views
1

我無法從輸入字符串中分離數字和字符。我的程序的目的是進行加,減,乘,在後綴劃分 所以我不能預測該輸入形式,因爲它可以從 2 2 3 + *(回答爲10)2 2任何+ 3 *(答案是12)。所以我不能使用sscanf來提取數字和運算符字符,而沒有特定的格式輸入字符串。我應該在這裏做什麼?從字符串中提取數字和字符,它不遵循特定的格式? (後綴計算器)

+1

這功課嗎?您的「需要使用獲取,然後轉換」的評論似乎表明了這一點。 – Vatine 2010-03-06 10:56:28

+0

是的,我被困在這個階段。 – silent 2010-03-06 10:59:29

+0

標記功課。 – Tronic 2010-03-06 11:06:11

回答

2

好了,來處理你將要實現堆棧後綴,所以你應該將每個數字推到堆棧上,每個操作員從堆棧中彈出兩個數字並將結果推回。

+0

我正在使用一個堆棧,但對於輸入im需要使用獲取,然後轉換並將數字推入堆棧... – silent 2010-03-06 10:49:10

+0

爲什麼不使用isalpha()來檢測它是數字還是操作符 – uray 2010-03-06 10:56:13

+1

必需使用獲取?告訴你的老師,這個功能被設計破壞了。手冊頁說 - 永遠不要使用gets()。因爲事先不知道數據是不可能知道get()將讀取多少個字符的,並且因爲gets()會繼續存儲超過緩衝區末尾的字符,所以使用它非常危險。它已被用來破壞計算機安全。使用fgets()代替。 – Tronic 2010-03-06 13:33:30

0

我會推薦使用Boost.Spirit Qi,這是一個非常好的解析器庫。第一個例子是一個計算器...

http://www.boost.org/doc/libs/1_42_0/libs/spirit/doc/html/spirit/introduction.html

標準庫唯一的解決辦法:

// Get a line of user input (simplifies I/O) 
std::string line; 
if (!std::getline(std::cin, line)) throw std::runtime_error("Unable to read line"); 
// Process the line as an input string stream 
std::istringstream iss(line); 
while (true) { 
    unsigned int val; 
    if (iss >> val) { 
     // TODO: Handle a numeric value (in val) 
     continue; 
    } 
    iss.clear(); // Clear the error state 
    char ch; 
    if (!iss.get(ch)) break; // Break the loop if there is no more input 
    // TODO: Handle a character (in ch) 
} 
+0

用stdlib解決方案更新。 – Tronic 2010-03-06 13:09:20

+0

作業可能更好地堅持基礎而不是圖書館。 – NomeN 2010-03-12 13:39:11

2

一種方法是使用scanf("%s"),它將返回字符直到下一個空格。或者您可以使用getc一次獲取一個字符。

編輯:

我從您正在使用獲取一整行讀取,在這種情況下的評論看,你可能會在循環中使用strtok打破行成令牌,然後看看會更好在每個令牌的第一個字符處決定如何處理它。

char line[MAX_LINE]; 
// read in the line 

char * pTok = strtok(line, " \t"); 
while (pTok) 
{ 
    char ch = pTok[0]; 
    if (isdigit(ch)) 
     //handle number 

    if (ch == '+') 
     //handle addition operator 

    ... 
    pTok = strtok(NULL, " \t"); 
} 
+0

他使用C++,所以等價物將是std :: cin >> val(跳過空格並嘗試讀取數字)和std :: cin.clear();讀取數字後std :: cin.get(ch)失敗。 – Tronic 2010-03-06 10:46:48

+0

@Tronic:他是那個提到sscanf的人。 C++代碼不需要使用std ::。 – 2010-03-06 10:49:39

+0

我可以使用scanf,但是計算的數字量是可變的 – silent 2010-03-06 10:52:50

0

我可能會通過抓取一整行做到這一點,然後有一個函數取一個字符串,偏移和返回結構。返回結構包含標記的開始和結束偏移量,標記類型(運​​算符,參數)以及其他可能的東西。

或者,將其分成兩個函數,一個用於檢查數字,另一個用於檢查運算符。

相關問題