2013-07-24 41 views
0

這裏是我用C++編寫的完整程序,while while循環,它在第一次運行時正確,但是當它循環時它無法正常工作。C++簡單代碼中的字符串數組

該程序將名稱存儲到數組中並打印出來。數組大小是50,所以我想在數組中存儲50個名字。

任何幫助將不勝感激。 謝謝。

#include <iostream> 
#include <cmath> 
#include <string> 
using namespace std; 

void start(int c); 

string NameArray [50]; 
char response; 

int main() { 
    int count=1; 
    do {  
    count = count - 1; 
    start(count); 
    cout << "do you want to add another name? "; 
    cin>> response;  
    count = count + 2;  
    cout<< endl;   
    } while (tolower(response)=='y'); 

    cout<< "program Ends" <<endl;   
    system ("pause");   
    return 0;  
}  

void start(int count) {   
    cout<< "Enter your First and Last name: ";   
    getline(cin, NameArray[count]);  
    cout<< NameArray[count] <<endl;  
    cout<< endl;   
} 
+3

再一次,不要說'using namespace std;'! –

+1

爲什麼你從'count = 1開始;'然後遞減?爲什麼不跳過這一步並在'cin >>響應;'行之後循環中的每次迭代中應用'count ++;'?或者甚至更好,使用'static int count = -1; count ++;'在'start'函數內部,並且跳過'main'中的'count' ... – abiessu

+1

這是一個完全可怕的循環索引。在第一個數字(0)處開始索引,並在添加輸入後增加*。索引只能在循環中的一個點上增加/減少,只能增加+/- 1。 –

回答

0

首先使用顯式循環並打破而不是做一段時間,因爲這可以讓你避免緩衝區溢出和neatens了代碼。我也從jxh的回覆中加入了修復。像這樣的東西。 (未測試)

#include <iostream> 
#include <cmath> 
#include <string> 
using namespace std; 

void start(int c); 

string NameArray [50]; 
std::string response; 

int main() { 
    for(int count=0; count<50; ++count) { 
    start(count); 
    cout << "do you want to add another name? "; 
    std::getline(cin,response); 
    if (tolower(response[0])=='y') break; 
    } 

    cout<< "program Ends" <<endl;   
    system ("pause");   
    return 0;  
}  

void start(int count) {   
    cout<< "Enter your First and Last name: ";   
    std::getline(cin, NameArray[count]);  
    cout<< NameArray[count] <<endl;  
    cout<< endl;   
} 

但是真正的固定長度數組是一個問題,我完全避免使用矢量來代替。然後你可以完全擺脫伯爵。該代碼看起來會像這樣:

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

std::string ask_user_for_name(); 

std::vector<string> NameArray; 

int main() { 
    do { 
    NameArray.push_back(ask_user_for_name()); 
    std::string response; 
    cout << "do you want to add another name? "; 
    std::getline(cin,response); 
    if (tolower(response[0])=='y') break; 
    } while(true); 

    cout<< "program Ends" <<endl;   
    system ("pause");   
    return 0;  
}  

std::string ask_user_for_name() {   
    cout<< "Enter your First and Last name: ";   
    std::string retval; 
    getline(cin, retval); 
    cout<<retval<<std::endl<<std::endl; 
    return retval;  
} 
2

cin>> response將檢索輸入的一個字符,並在其後留下換行符輸入流。這將導致您的start()函數在它提示輸入您的姓名後立即返回,並且getline()將一個空行輸入NameArray

您可以改用getline()也檢索作爲一個字符串您的回覆,然後檢查

//... 
    cout << "do you want to add another name? "; 
    std::string line; 
    std::getline(std::cin, line); 
    response = line[0]; 
    //... 
0

其他人所說的風格問題,該行的第一char,但眼前的問題是在這裏:

cout << "do you want to add another name? "; 
    cin>> response; 
    count = count + 2;  
    cout<< endl;   
} while (tolower(response)=='y'); 

在你的start()功能,你正確閱讀完整一行getline(),但在這裏你的cin >> response;會留下一個換行符,也許其他在輸入緩衝區中的東西。而是試試這個:

std::string response; 

//... 

    cout << "do you want to add another name? "; 
    getline(cin, response); // Changed here 
    count = count + 2;  
    cout<< endl;   
} while (tolower(response[0])=='y'); // And changed here 
+0

感謝所有分享想法的人,但肯Y-n和spartygw解決方案讓我朝着我需要的正確方向前進。 - 所以現在我會學習這個cin.ignore()一些 - 謝謝。 –

+0

好,它爲你修好了!請不要忘記[將最有用的答案標記爲「已接受」](http://stackoverflow.com/help/someone-answers)。 –

-2

夥計們正在使這個過於複雜。你給cin的第二個電話正在讀一個換行符並立即返回。下面是最快的修復方法:在你的getline調用之前添加cin.ignore():

cin.ignore(); 
getline(cin, NameArray[count]); 
+0

非常感謝spartygw這工作得很好 - 這正是我需要的。 –

+1

如果用戶鍵入「yes」而不是「y」,並且其他黑客如'cin.ignore(INT_MAX);'如果輸入來自文件管道,將無法正常工作。 –

+0

謝謝你的投票我的回答@Keyn Y-N – spartygw