如何在C ++中的字符串之间使用cin?

时间:2015-12-14 23:32:43

标签: c++ string cin

我对C ++很新,并且一直在学习这样的东西:

cout << "My age is: ";
cin >> age;

与cin混在一起,我遇到了障碍。

说我想写#34;我已经x岁了!&#34;。

&#34; X&#34;是cin&gt;&gt;年龄;

我写这样的代码。

cout << "I am ";
cin >> age;
cout << "years old!";

障碍是这会产生换行符。

我不想要换行。

我怎样才能把这一切留在一条线上?

5 个答案:

答案 0 :(得分:22)

我假设您确实希望输入与最终输出一致。否则,解决方案是微不足道的:首先读取值然后打印它,例如:

std::cout << "how old are you? ";
std::cin >> x;
std::cout << "I am " << x << " years old\n";

处理与输出一致的输入有点棘手。这里的问题是控制台处理实际上是由系统完成的,而不是由语言完成的。因此,在输入数据时必须等待换行。换行符将由控制台处理并创建换行符。要禁用此行为,必须依赖于控制台行为。没有标准的C ++方法。

我不知道如何在Windows上处理控制台控件:我主要是UNIX程序员。在UNIX系统上,您使用tcgetattr()tcsetattr()将输入模式设置为非规范(即清除ICANON位)。所需的文件描述符只是标准输入的文件描述符,即0

一旦控制台使用非规范模式,所有按键操作都会立即转发到应用程序,并且不会进行任何屏幕回显。结果,读取功能实际上需要回显单个字符,然后转发到解析功能。最简单的方法是创建一个过滤流缓冲区,在转发字符时对std::cinstd::cout进行必要的回显。然而,将所有这些放在一起是一项工作......

在烹饪演示时,我注意到我还需要处理回声(当用户使用回车键时避免换行)。重置控制台标志也很重要,因为即使在程序终止后,它们中的一些实际上仍保持更改。将这些位放在一起但仍然缺少错误处理的实现可能如下所示:

#include <iostream>
#include <ctype.h>
#include <termios.h>

struct non_canon_buf
    : std::streambuf {
    char buffer;
    non_canon_buf() {
        termios flags = {};
        tcgetattr(0, &flags);
        flags.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(0, TCSANOW, &flags);
    }
    ~non_canon_buf() {
        termios flags = {};
        tcgetattr(0, &flags);
        flags.c_lflag |= ICANON | ECHO;
        tcsetattr(0, TCSANOW, &flags);
    }
    int underflow() {
        if (std::cin.get(buffer)) {
            this->setg(&buffer, &buffer, &buffer + 1);
            if (!std::isspace(static_cast<unsigned char>(buffer))) {
                std::cout << buffer << std::flush;
            }
            return std::char_traits<char>::to_int_type(buffer);
        }
        return std::char_traits<char>::eof();
    }
};

int main()
{
    non_canon_buf sbuf;
    std::istream  in(&sbuf);
    std::cout << "I am ";
    int age = 0;
    in >> age;
    std::cout << " years old\n";
    if (!in) {
        std::cout << "ERROR: failed to enter a valid age!\n";
    }
}

答案 1 :(得分:11)

cin在换行符输入控制台后读取输入。

因此,你可以连续做的唯一方法是提示用户他们的年龄,然后继续写。

e.g:

std::cout << "Enter your age> ";
std::cin >> age;
std::cout << "I am " << age << " years old" << std::endl;

答案 2 :(得分:8)

unsigned int age;
std::cin >> age;

std::cout << "I am " << age << " years old!" << std::endl;

答案 3 :(得分:6)

你无法在纯C ++中做你想做的事。您可以像其他人一样建议并重新打印该行:

for %%Q in (%currentRoom%) do set Nfilesize=%%~zQ

或者您可以使用特定于操作系统的功能来清除控制台输出。 Read about this here

例如,您可以在Windows上使用std::cout << "I am " << age << " years old!\n" ,在询问用户年龄后清除控制台。

system("cls");

收率:

  

#include <stdlib.h> int main(int argc, char* argv[]) { unsigned int age; std::cout << "My age is: " std::cin >> age; system("cls"); std::cout << "I am " << age << " years old!\n" ... }

答案 4 :(得分:0)

你可以这样做

int user_age;

std:cout<<"Enter Your Age:"         //Ask user for age

std::cin >>user_age;                //Read user input
std::cout<<"I am"<<user_age<<"years old!"<< std::endl; //finlly display the value