2015-12-14 13 views
22

私はC++にかなり新たなんだと、このようなことを学んでされています:C++で文字列の間でcinを使用するにはどうすればよいですか?

CINいじり
cout << "My age is: "; 
cin >> age; 

は、私がバリケードを越えてきました。

「私はx歳です!」と書いたかったといいます。

"x"はcin >> ageです。

私はこのようなコードを書いています。

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

ロードブロッキングは改行を生成することです。

私は改行したくありません。

どうすればこの行を1行にまとめることができますか?

+4

のように行うことができます。これは私にはあまり意味がありません。最初に*年齢を入力して 'std :: cout <<"を出力するようにしてはいけません。私は "<< x <<"歳です。\ n "'全体として? – 5gon12eder

+0

あなたは、ユーザーが年齢を入力できる空白のようなものを考え出していますか?そうであれば、残念ながら、それはテキストベースのシステムが一般的にどのように機能するかではありませんが、これは[ncurses](https://en.wikipedia.org/wiki/Ncurses)で行うことができると確信しています。複雑です。 – Numeri

+1

改行なしで何かを入力する方法は、ストリームのバッファリングをオフにすることです。しかし、それはあなたが使用しているOSに依存し、C++の一部ではありません。たとえば、Windowsでは文字を画面にエコーすることなく文字を取得し、後でどの文字を画面に表示するかを決めることができます。 –

答えて

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

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

これは解決策ではなく、この問題を回避するための方法です。 – FalconUA

+3

何ですか?それは意味をなさない... – erip

+0

'std :: endl'を使うのに唯一のもので、' \ n'ではなく、もう1つです。 – Mawg

11

cin改行がコンソールに入力された後に入力を読み取ります。

したがって、継続的に行うことができる唯一の方法は、ユーザーに年齢を入力してからそれを書き込むことです。

例えば:

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

新しい行のものを参照できますか? – dhein

22

私はあなたが実際に入力が最終的な出力とに沿ったものにしたいと仮定します。そうでなければ、溶液は自明である:最初の値を読み取り、それを印刷し、例えば:

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

出力とラインにある入力を扱うもう少しトリッキーです。ここでの問題は、コンソール操作が実際には言語ではなくシステムによって行われることです。その結果、データを入力するときに改行を待つ必要があります。改行はコンソールで処理され、改行が作成されます。この動作を無効にするには、コンソールの動作に依存する必要があります。これを行うための標準的なC++の方法はありません。

私はWindows上でコンソールコントロールを処理する方法がわかりません。私は主にUNIXプログラマです。 UNIXシステムでは、入力モードを非正規(すなわち、ICANONビットをクリアする)に設定するには、tcgetattr()tcsetattr()を使用します。必要なファイル記述子は、単に標準入力用のファイル記述子、つまり0です。

コンソールが非標準モードを使用すると、すべてのキー押下が直ちにアプリケーションに転送され、画面エコーは行われません。結果として、読み込み関数は実際には個々の文字をエコーし​​、次に解析関数に転送する必要があります。最も簡単な方法は、文字を転送しながらstd::cinstd::coutに必要なエコーを行うフィルタリングストリームバッファを作成することです。しかし、それをまとめることはちょっとした作業です...

デモを調理するとき、エコーに対処する必要があることに気付きました(ユーザーがEnterキーを使用するときに改行を避けるため)。また、コンソールフラグをリセットすることも重要です。コンソールフラグの一部は、プログラムが終了しても実際に変更されているためです。実装は、一緒にビットを置くが、それでもエラー処理を欠いていることは、このようになります。

#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"; 
    } 
} 
+2

完全性のために、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)(またはstdinを使った' ReadFile')を使うことができます。 – Bob

+1

@Mawgこれは信頼できるソースではないかもしれませんが、[cppreference.com](http://en.cppreference.com/w/cpp/io/manip/endl)には 'std :: endl'についてのメモがあります"ソースによって推奨される '\ n'の代わりにstd :: endlを使用すると、出力パフォーマンスが大幅に低下する可能性があります。だからそれは '\ n'のものかもしれません。 – Alex

+1

@Mawg: '\ n'は完全に有効なC++です。あなたは 'std :: endl'を好むかもしれませんが、嫌いなコーディング規約を使用する答えにStack Overflowコメントを吹き込むべきではありません。また、 '\ n'と' std :: endl'は、Alexのリンクで説明されているように、技術的にはまったく同じことさえしていないことにも注意してください。 – FrederikVds

6

あなたは純粋なC++でやりたいことはできません。

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

また、コンソール固有の機能を使用してコンソール出力をクリアすることもできます。 Read about this here

たとえば、Windowsには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" 
    ... 
} 

収量:

C:>AgeProgram.exe I am 10 years old

+0

@Mawg 'std :: endl'は' cout'バッファをフラッシュします。非常に少数の場合、実際にこれが欲しいのですか? '' \ n "'と 'endl'は他のすべての点で同じです。 [これを読む](http://stackoverflow.com/questions/213907/c-stdendl-vs-n) –

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 
関連する問題