当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C++中的字符串之间使用cin?》经验,为你挑选了4个好方法。

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

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

和cin一起乱搞,我遇到了障碍.

说我想写"我已经x岁了!".

"x"是cin >>年龄;

我写这样的代码.

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

障碍是这会产生换行符.

我不希望换行.

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



1> Dietmar Kühl..:

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

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::cin,以std::cout在转发的字符.然而,将所有这些放在一起是一项工作......

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

#include 
#include 
#include 

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(buffer))) {
                std::cout << buffer << std::flush;
            }
            return std::char_traits::to_int_type(buffer);
        }
        return std::char_traits::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";
    }
}


只是为了完整性,Windows等效项将是[`SetConsoleMode`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033.aspx),并禁用"ENABLE_LINE_INPUT"和"ENABLE_ECHO_INPUT".然后[`ReadConsole`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684958.aspx)(或`与标准输入ReadFile`)都可以使用.

2> Olipro..:

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

因此,您可以连续执行此操作的唯一方法是提示用户他们的年龄,然后继续编写它.

例如:

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



3> erip..:
unsigned int age;
std::cin >> age;

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



4> Fantastic Mr..:

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

std::cout << "I am " << age << " years old!\n"

或者您可以使用特定于操作系统的功能来清除控制台输出.在这里阅读这个.

例如,您可以使用system("cls");Windows,在询问用户年龄后清除控制台.

#include 

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"
    ...
}

产量:

C:>AgeProgram.exe I am 10 years old

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有