2014-09-28 43 views
-2

(我在C輸入/處理字符串非常糟糕。希望這個問題會教我很多東西。)輸入在C即數學的陳述和返回值

我試圖做一個函數,將輸入來自stdin的算術字符串,例如23 + 45 * 6 - 5,並返回該值。

有多個字符串,輸入一個接一個,可以是任意長度,並且運算符優先順序無關緊要,即它按順序處理字符串。

,我所面臨的問題是: -

  1. \n從以前的字符串也被認爲是string.So如果我輸入的字符串3,它實際上是6,3串和3 \n
  2. 我使用了一個字符指針並使用了char * input; scanf(" %s",input);,但是除了上面的問題,我還得到了段錯誤,我猜是因爲缺少\0

我的問題是忘記我做了什麼混亂,你會做什麼或在上述場景中處理字符串輸入的最佳方式是什麼。虛擬代碼就足夠了。謝謝。

我是做

#include <stdio.h> 

int main() 
{ 
    int t; //no of test cases 
    char input; 
    scanf("%d",&t); 
    while(t--) 
    { 
     while((input=getchar())!='\n') 
     { 
      //use switch to identify char and follow appropriate action 
      printf("%c\n",input); 
     } 
    } 
    return 0; 
} 
+1

在這裏你不會得到免費的代碼。顯示你的嘗試,我們會指出錯誤。 – Igor 2014-09-28 15:19:54

+1

如果你使用['fgets'](http://en.cppreference.com/w/c/io/fgets),那麼換行符將在* current *行的緩衝區中。由於它是最後一個,很容易刪除(用終止符替換)。 – 2014-09-28 15:20:28

+1

這個問題還不清楚(特別是沒有顯示你的代碼),但如果你輸入一個帶空格的字符串,你應該使用'fgets'而不是'scanf'。 – interjay 2014-09-28 15:20:35

回答

0

什麼後,您掃描的檢查,看它是否是一個「\ n」,如果不理會處理並移動到下一個字符串。

或者你可以嘗試:

所有的
char input[101]; 
scanf("%s\n", &input); 
-1

第一。作爲第一個項目編寫一個表達式分析器的想法並不是很好。從一個更簡單的項目開始。

由於您嘗試將數據(使用scanf())讀入未初始化的指針,因此會出現垂度錯誤。

char * input;

將不會爲要用scanf()讀取的字符串分配任何內存。你必須使用類似於

char input [256]的緩衝區;

並給予指向緩衝區的指針到SCANF( 「%S」,輸入)(奧德爲了更好地理解的scanf( 「%S」,&輸入[0]);

Anywhere中,該緩衝液只具有255個字符來存儲,你必須知道,如果你在scanf函數輸入更多然後255個字符(),你會得到一個非法的內存訪問以及。

克勞斯

1

正如約阿希姆Pileborg建議,使用fgets 。使用char數組,而不是一個char變量來存儲字符串。

char input[100]; 
fgets(input, sizeof(input), stdin); 

fgets超過sscanf的優點是fgets可以讀取你的輸入空間。

它將包含行尾字節\n,所以3個字符串不會變成6個字符串。

像往常一樣用fgets,輸入的長度有一個任意的限制。如果用戶輸入的內容超過了98個字節,系統將無法適應所有內容(加上行尾\n和字符串尾\0字節),程序將收到截斷的字符串。

如果你不能容忍,使用getline(這很難使用,所以如果有疑問,使用fgets)。

+0

我會建議相反的:使用'getline',如果你不能使用它,用一個相當大的行緩衝區(例如至少256字節)降級到'fgets'。 – 2014-09-28 16:19:55