2012-12-18 30 views
0

不知何故,當我運行此代碼並涉及到輸入字符串時,第一個字符串i = 0將被跳過,並開始從A [1]輸入字符串。所以我最終得到了內存中隨機填充的A [0]。有人可以指出這個問題嗎?字符串數組中的第一個字符串正在被跳過

​​
+2

讓我們看看在收集這些字符串後打印這些字符串的代碼。 – mah

回答

2

可能是因爲你使用gets()函數...從來沒有使用gets() 用fgets()代替。

gets vs fgets

+0

該文章在第一個字上失敗......「C/C++」 –

5

該代碼是可怕的。以下是它在實際C++中的外觀:

#include <string> 
#include <iostream> 
#include <vector> 

int main() 
{ 
    std::cout << "Please start entering lines. A blank line or " 
       << "EOF (Ctrl-D) will terminate the input.\n"; 

    std::vector<std::string> lines; 

    for (std::string line; std::getline(std::cin, line) && !line.empty();) 
    { 
     lines.push_back(line); 
    } 

    std::cout << "Thank you, goodbye.\n"; 
} 

請注意缺少任何指針或new表達式。

如果您喜歡,您可以在for循環中的條件檢查開始處添加std::cout << "> " &&以添加一點提示。

1

那麼,你可能會得到一個空字符串:當閱讀s時,你使用格式化輸入,一遇到非數字就停止,例如用於指示輸入的換行已完成。因此,立即找到換行符,終止讀取的第一個字符串。

這就是說,你應該從來沒有使用gets():這是一個主要的安全問題和許多潛在的攻擊的根本原因!相反,您應該使用fgets()或更好的std::getline()以及std::string s和std::vector<std::string> >。 ASLO,你應該總是驗證嘗試輸入是成功的:

if ((std::cin >> s).ignore(std::numeric_limits<std::streamsize>::max(), `\n`)) { 
    std::string line; 
    for (int i(0); i != s && std::getline(std::cin, line);) { 
     A.push_back(line); 
    } 
} 
1

的問題是,cin>>s;只是拿起你想要的號碼,(從enter按換行)離開\nstdingets()在第一次迭代中提到。這不是修復它,但要證明這一點寫這行線後的最好方式:

int a = fgetc(stdin); 

退房a事後確認它有一個換行符。

+0

任何方式我可以清除標準輸入\ n? – lwiii

+0

我指定的方式工作正常,並且是最小的變化;但更優雅的方式會像Kerrek SB建議的那樣使用'std :: getline'。 – imreal

+0

您也可以倒退()stdin來清除輸入緩衝區。 – HerrJoebob

相關問題