用c ++中的空格读取字符串

时间:2013-10-20 11:09:33

标签: c++

如何用空格读取输入行(类型字符串)?我试过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;
}

3 个答案:

答案 0 :(得分:7)

“如何用空格读取输入行(类型字符串)?”

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

请注意,除了检查std:getline来电的返回值之外,您还应避免将>>运算符与std::getline调用混合。一旦你决定逐行读取文件,只需创建一个巨大的循环并在使用字符串流对象时进行额外的解析似乎更清晰,更合理,例如:

std::string line;
while (std::getline(std::cin, line)) {
    if (line.empty()) continue;
    std::istringstream is(line);
    if (is >> ...) {
        ...
    }
    ...
}

答案 1 :(得分:4)

使用空格读取字符串而不打扰std命名空间的最简单方法如下

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    getline(cin,str);
    cout<<str;
    return 0;
}

答案 2 :(得分: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++;
}