c++ 只从cin读取一个字符

pokxtpni  于 2023-03-05  发布在  其他
关注(0)|答案(5)|浏览(226)

当从std::cin读取时,即使我只想读取一个字符。它将等待用户插入任意数量的字符,然后单击Enter继续!
我想逐个字符地读取字符,并在用户在终端中键入时对每个字符执行一些指令。

示例

如果我运行这个程序并键入abcd,那么Enter的结果将是

abcd
abcd

但我希望它是:

aabbccdd

下面是代码:

int main(){
    char a;
    cin >> noskipws >> a;
    while(a != '\n'){
        cout << a;
        cin >> noskipws >> a;
    }
}

请问怎么做?

brqmpdu1

brqmpdu11#

以C++友好的方式从流中读取单个字符的最佳方法是获取底层streambuf并使用sgetc(a)/次会议c()方法。但是,如果cin是由终端提供的,(典型情况)则终端可能启用了行缓冲,所以首先你需要设置终端设置来禁用行缓冲。2下面的例子也禁用了字符的回显。

#include <iostream>     // cout, cin, streambuf, hex, endl, sgetc, sbumpc
#include <iomanip>      // setw, setfill
#include <fstream>      // fstream

// These inclusions required to set terminal mode.
#include <termios.h>    // struct termios, tcgetattr(), tcsetattr()
#include <stdio.h>      // perror(), stderr, stdin, fileno()

using namespace std;

int main(int argc, const char *argv[])
{
    struct termios t;
    struct termios t_saved;

    // Set terminal to single character mode.
    tcgetattr(fileno(stdin), &t);
    t_saved = t;
    t.c_lflag &= (~ICANON & ~ECHO);
    t.c_cc[VTIME] = 0;
    t.c_cc[VMIN] = 1;
    if (tcsetattr(fileno(stdin), TCSANOW, &t) < 0) {
        perror("Unable to set terminal to single character mode");
        return -1;
    }

    // Read single characters from cin.
    std::streambuf *pbuf = cin.rdbuf();
    bool done = false;
    while (!done) {
        cout << "Enter an character (or esc to quit): " << endl;
        char c;
        if (pbuf->sgetc() == EOF) done = true;
        c = pbuf->sbumpc();
        if (c == 0x1b) {
            done = true;
        } else {
            cout << "You entered character 0x" << setw(2) << setfill('0') << hex << int(c) << "'" << endl;
        }
    }

    // Restore terminal mode.
    if (tcsetattr(fileno(stdin), TCSANOW, &t_saved) < 0) {
        perror("Unable to restore terminal mode");
        return -1;
    }

    return 0;
}
ghhkc1vu

ghhkc1vu2#

C++ cin模型是用户在终端中编写一整行,退格并在必要时进行纠正,然后当他高兴时,将整行提交给程序。
你不能轻易地打破它,也不应该打破它,除非你想控制整个终端,比如让一个小人在一个由按键控制的迷宫里游荡。要做到这一点,在Unix系统上可以使用curses. h,在DOS系统上可以使用conio. h。

s2j5cfk0

s2j5cfk03#

我认为你应该自己写一个结构体。像我一样,我使用

#include<iostream>
#include<conio.h>

using namespace std;

char get_char(){
    int k;
    int i = 0;
    while(i == 0){
        if(kbhit()){
            k = _getch();
            i++;
        }
    }
    return char(k);
}

int main(){
    char minhvu[10];
    for(int i = 0; i < 10; i++){
        minhvu[i] =  get_char();
        cout << minhvu[i];
    }
}

但这有一个弱点,我必须写正确,不能删除和改写像使用cin

ia2d9nvy

ia2d9nvy4#

请看:

std::cin.get(char)
zour9fqk

zour9fqk5#

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    char a;
    do{
        a=getche();
        cout<<a;
    }while(a!='\n');
    return 0;
}

相关问题