[英]using strings in c++ and cygwin
我是新來的,所以我需要一點幫助。 我想允許輸入的字符和空格與輸入所需的字符數一樣多,例如,我鍵入cin >> name和cin >> birthday,如果此人鍵入他們的名字和姓氏,那么它將跳過下一個cin功能。 我要如何避免這種情況,我希望能夠只將名稱聲明為某種字符串或字符,而不必經歷整個名稱= first + last的考驗,並讓它們先輸入后輸入..如果有人得到我的意思我只需要頭文件和適當的聲明..im,這是新的,但是我肯定不明白我可能會得到的復雜答案
使用std :: getline在一行上獲取輸入。
std::string name;
std::getline(std::cin, name);
或者,如果您希望生日在同一行,則執行此操作。
std::string input;
std::getline(std::cin, input);
std::istringstream input_stream(input);
std::string first_name, last_name, birthday;
if (!(input_stream >> first_name)) std::cout << "Input cannot be empty.\n";
if (!(input_stream >> last_name)) std::cout << "You must have a last name.\n";
if (!(input_stream >> birthday)) std::cout << "You forgot your birthday.\n";
如果生日中包含空格,則可以在流中其余單詞上使用std :: getline。
std::getline(input_stream, birthday);
所以最終您的程序變為:
#include <iostream>
#include <sstream>
int main()
{
std::string input;
std::getline(std::cin, input);
std::istringstream input_stream(input);
std::string first_name, last_name, birthday;
if (!(input_stream >> first_name)) std::cout << "Input cannot be empty.\n";
if (!(input_stream >> last_name)) std::cout << "You must have a last name.\n";
input_stream.ignore(); // Discard space that doesn't get extracted out
std::getline(input_stream, birthday);
std::cout << first_name << "\n";
std::cout << last_name << "\n";
std::cout << birthday;
}
為了丟棄流中剩余的空間,請使用input_stream.ignore();
。
如果要處理包含空格的名稱,請應用相同的原理。 這次,您必須提供忽略的參數來告訴它放棄空格。
int main()
{
std::string input;
std::getline(std::cin, input);
std::istringstream input_stream(input);
std::string first_name, last_name, birthday;
std::getline(input_stream, first_name, ',');
input_stream.ignore(1, ' '); // Discard space
std::getline(input_stream, last_name, ',');
input_stream.ignore(1, ' '); // Discard space
std::getline(input_stream, birthday, ',');
std::cout << first_name << "\n";
std::cout << last_name << "\n";
std::cout << birthday;
}
示例運行:
First Name, Last Name, This is a birthday
First Name
Last Name
This is a birthday
基本上,您想用空格分割字符串。 以下程序使用向量存儲元素。 檢查它的大小,如果為3,則假定已給出名字和姓氏。
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::string buffer;
std::getline(std::cin, buffer);
std::vector<std::string> v;
std::string tmp;
for(unsigned i = 0; i < buffer.length(); i++) {
tmp += buffer[i];
if(buffer[i] == ' ') {
v.push_back(tmp);
tmp = "";
}
}
// push the last one
v.push_back(tmp);
copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
編譯與測試
g++ -Wall -Wextra main.cc -o main
測試數據此文件稱為test.txt
FIRST LAST 10242014
要測試執行此命令:main <test.txt
預期產量
FIRST
LAST
10242014
我將始終使用std::getline()
。 我知道您要求在一行上輸入所有名稱,但是我總是將名稱收集拆分為單獨的行,因為名字,名字和姓氏都可以包含空格(例如Du Vall)。
struct person
{
std::string f_name;
std::string m_name;
std::string l_name;
std::string DOB;
};
person p;
std::cout << "First name: ";
std::getline(std::cin, p.f_name);
std::cout << "Middle name(s): ";
std::getline(std::cin, p.m_name);
std::cout << "Last name: ";
std::getline(std::cin, p.l_name);
std::cout << "Date Of Birth: ";
std::getline(std::cin, p.DOB);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.