簡體   English   中英

在c ++和cygwin中使用字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM