8

空白を含む入力行(文字列型)を読み取るにはどうすればよいですか? getline を試しましたが、無限ループに陥ります。以下は私のコードです。

#include <iostream>
#include <cstring>

#define MAX 50 //size of array

//Used G++ 4.6.3 compiler
using namespace std;

int main() {

struct Manager {
string name;
int age;
int working_years;
string phone;
int salary;
}info[MAX];

char inp; //To choose options
int array_pos = 0; //Current position in array of Manager structure
string search_name; //Manager name you want to search

cout << "Press 'i' to insert manager information or 's' to search for manager information by name or 'a' to abort: ";
cin >> inp;

while(inp != 'a') {
int search_num = 0; //array position at which search result is found
int found = 0;
if (inp == 'i' || inp == 's') {
    if (inp == 'i') {
        int k = array_pos;
        cout << "Enter the information of the manager no "<<k+1<<" is : "; 

        cout << "Enter the Name : "; 
                     //infinte loop occurs
        getline(info[array_pos].name, '\n');
        //cin >> info[array_pos].name;

        cout<<"Enter manager age : "; 
        cin >> info[array_pos].age;

        cout << "Enter manage working years : ";
        cin >> info[array_pos].working_years;

        cout << "Enter manager phone no. : ";
        cin >> info[array_pos].phone;

        cout << "Enter manager salary : ";
        cin >> info[array_pos].salary;
        array_pos++;
    }
    if (inp == 's') {
        cout << "Enter the manager name you want to search : ";
        cin >> search_name;
        for(int i = 0; i < array_pos; i++) {
            //using str1.compare(str2) to compare manager name
            if(info[i].name.compare(search_name) == 0) { //manager name found in array of structure
                found = 1;                  
                search_num = i;                 
                cout << "Name : " << info[search_num].name << "\n";
                cout << "Age: " << info[search_num].age << "\n";
                cout << "Working Years: " << info[search_num].working_years << "\n";
                cout << "Phone No. : " << info[search_num].phone << "\n";
                cout << "Salary : " << info[search_num].salary << "\n";
            } //end of if loop for comparing string
        } //end of for loop for searching
        if(found == 0)
            cout << "No Manager by this name exist in record" << "\n"; 

    } //end of if loop

} //end of if loop for  searching or insertion
if(inp == 'a')
    break;

cout << "Press 'i' to insert manager information or 's' to search for manager information by name or 'a' to abort: ";
cin >> inp;
} //end of while loop

return 0;
}
4

3 に答える 3

8

「空白を含む入力行 (文字列型) を読み取るにはどうすればよいですか?」

std::string line;
if (std::getline(std::cin, line)) {
    ...
}

callの戻り値をチェックすることとは別に、演算子と呼び出しstd:getlineを混在させないようにする必要があることに注意してください。ファイルを 1 行ずつ読み取ることにした場合は、文字列ストリーム オブジェクトを使用して 1 つの巨大なループを作成し、追加の解析を行う方がクリーンで合理的なようです。次に例を示します。>>std::getline

std::string line;
while (std::getline(std::cin, line)) {
    if (line.empty()) continue;
    std::istringstream is(line);
    if (is >> ...) {
        ...
    }
    ...
}
于 2013-10-20T11:12:35.237 に答える
4

std 名前空間を気にせずにスペースを含む文字列を読み取る最も簡単な方法は次のとおりです。

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    getline(cin,str);
    cout<<str;
    return 0;
}
于 2015-06-12T06:26:32.967 に答える
3

解決策 1:

char c;
cin >> noskipws;    // Stops all further whitespace skipping
while (cin >> c) {  // Reads whitespace chars now.
    count++;
}

解決策 2:

char c;
while (cin.get(c)) {  // Always reads whitespace chars.
    count++;
}
于 2013-10-20T11:15:04.600 に答える