cin.getline的問題

int strlen2(char *str1){

int i=0 ;

for (i=0; str1[i] != '\0' ;i );

return i;

}

int _tmain(int argc, _TCHAR* argv[])

{ int IChange; //選擇何種處理方式

char str1[30];

int len=0;

int i;

cout << "1.計算字串長度 2.字串結合 3. 4 5 6 7 8 9 10" << '\n';

cin >> IChange;

switch (IChange){

case 1://計算字串長度

cout<< "請輸入一個字串!";

cin.getline (str1,80,'\n');

len = strlen2(str1);

cout << "這個字串的長度是:" << len;

break;

case 2:

break;

case 3:

break;

case 4:

break;

case 5:

break;

case 6:

break;

}

system("pause");

return 0;

}

我本來要一次寫很多字串的用法,但寫到第一項就卡住了,

本來是cin的傳回值有空白就有停,然後我到網路上看到cin.getline(str1,80,'\n')的寫法,但更糟的是他變成,一次就印出全部的東西。

假設:我選1然後他就印出:請輸入一個字串!這個字串的長度是:0

我連輸入的機會都沒了>"<

1 個解答

評分
  • Lv 7
    2 0 年前
    最佳解答

    在C++裡使用者輸入的資要都會被C++存入一個暫時區. 而cin會從那個暫時區中把資料取出. 當C++執行到cin >> IChange;時使用者輸入1和按enter鍵. 所以C++把1和'\n'存入暫時區. 因你是要個整數所以cin >> IChange只會把1取出. 而把'\n'留在暫時區中.當cin.getline (str1,80,'\n');被執行時getline()會先讀取'\n'. 而getline()裡你寫讀到'\n'就停. 所以你會覺得getline()什麼都沒讀. 事實上getline()有讀, 只不過讀到使用者輸入1時的'\n'.(讀錯了) 如果我們在讀過IChange之後, 清除暫時區中的資料, 那getline()就會讀使用者輸入的值了.此問題有好幾種解法, 最正確的解法是用basic_istream裡的ignore()成員函式. (getline()也是basic_istream裡的成員函式, cin的型態是istream, 而istream繼承basic_istream. 所以basic_istream裡的getline()和ignore()可被basic_istream和istream的實體用)ignore()本身的意思是忽略或刪除的意思. 有兩個參數. 第1個是最多能刪除多少個字元. 第2個是刪除到什麼字元才能停. 這兩個只要一個成立ignore()就停止.例cin.ignore(20, '\n'); //最多能刪除20個字元或刪除到'\n'字元才能停.如果暫時區中有"hello world\nhello"的話, 那cin.ignore(20, '\n');會刪除"hello world\n". cin.ignore(5, '\n'); 會刪除"hello"試試在cin之後加cin.ignore(20, '\n');看看.懂不懂? 不懂請再問P.S. 如你是用VC++的話, VC++的getline()裡還有一個bug. 請參考http://tw.knowledge.yahoo.com/question/?qid=100503...

    參考資料: Myself
還有問題?馬上發問,尋求解答。