简体   繁体   中英

Reading string with spaces in c++

How can I read input line(type string) with whitespace? I tried getline but it goes into infinite loop. Following is my code.

#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;
}

How can I read input line(type string) with whitespace?

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

Note that apart from checking the return value of std:getline call, you should also avoid mixing >> operator with std::getline calls. Once you decide reading the file line by line, it seems to be cleaner and more reasonable to just make one huge loop and do the additional parsing while using string stream object, eg:

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

Simplest way to read string with spaces without bothering about std namespace is as follows

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

Solution #1:

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

Solution #2:

char c;
while (cin.get(c)) {  // Always reads whitespace chars.
    count++;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM