許せない心理テスト

C++で、
標準入力の<<を使って、標準入力から
char c;
と定義した変数cにNULL('\0')を入れたい場合、
どのように書けば良いのでしょうか?

質問者からの補足コメント

  • char c;

    if (cin >> c) {

    ...

    }
    で、標準入力(キーボード)から変数cにNULLを入れたい。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/02/24 00:27
  • iMacでは、Ctrl+DでNULLが入るようです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/02/24 01:54

A 回答 (6件)

演算子 >> で char を読み込む仕様は、


* ストリームバッファから1文字取り出し、仮引数cに書き込む。
* 入力がなされなかった場合、setstate(failbit)を呼び出す。
ですので、

入力がなされなかった場合に \0 を書き込むには
cin >> c;
if (cin.fail()) c = '\0';

参考)
https://cpprefjp.github.io/reference/istream/bas …
    • good
    • 0

「標準入力の<<を使って」と書いているのにプログラムでは「cin >> c」となっているのが謎だ.



キーボード (や設定) によっては
C-@
C-v C-@
などでヌル文字が入ることがある.

なお余談だが NULL と '\0' は全く違うものなので良い子は混同してはならない.
    • good
    • 0

> iMacでは、Ctrl+DでNULLが入るようです。


それはおそらく勘違いですね。
Ctrl-Dだと、長さゼロの入力になります。ファイルで言うと空ファイル(長さゼロのファイル)をリダイレクトしたような。

c = 'A';
cin >> c;
cout << c;
で、cinに対して Ctrl-D を押すと A が表示されると思います。
つまり、c にもともと \0 が入っていた状況だったので、Ctrl-Dで \0 が入ったと勘違いしたのでしょう。
    • good
    • 0

MacOS,Luinux等のUnix(系)OSの端末では、 Ctrl-D は EOF を意味します。


つまり、標準入力はその直前で終り、というとことです。
\0が入力されたわけではありません。
Windows では Ctrl-Zに相当します。

元のプログラムを確認してください。
求められているのは、本当に「\0を入力すること」ですか?
「入力を終わらせる=EOFを入力すること」ではないですか?
    • good
    • 1

コードでどう書くかというより、キーボードでどうやってNULを入力するかと言うことになるかと思います。



が、WindowsでもLinuxでも Ctrl-@ を入力しても認識されないですね。
キーボードからNULを入れるのは無理だと思うので、
printf '\0' | ./program
のようにパイプで送り込むか、特定の文字が入ったらNULと置き換えるように書いて、その文字を入力するか。
if(c=='!') c='\0';
この回答への補足あり
    • good
    • 0

「標準入力の<<を使って」ってどういうこと? プログラムや与えるデータの具体的な形を見せてもらえないかな?

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報