1

私は VBA から派生した C++ の全体的な専門知識を構築しようとしているので、私のコードに明らかな問題がある場合はご容赦ください... 以下のこの単純なプログラムを使用すると、予期しない出力が得られます。

#include <iostream>

int main() {
char f[]="", c[]="";
std::cin >> f;
std::cout << f << std::endl;
std::cin >> c;
std::cout << f << std::endl;
return 0;
}

実行すると、これが私の結果です:

ABC (入力)
f - ABC (出力)
DEF (入力)
f - EF (出力)

次のようにも試しました:

ABC DEF (入力)
f - ABC (出力)
f - EF (出力)

一度しか読み取っていないと思うので、出力は両方の行で同じになると思いfます。さらに、 を取得してcinに適用するとf、最初の試行で文字列 ( ) 全体が読み取られるのに、ABC2 回目の試行で が欠落するのはDなぜですか?

このコードを使って結果も出力してみましたが、同じ問題が発生するので、ここではcinand ではなく に問題があると仮定していcoutます。

for (j=0;j<3;j++) {
    std::cout << f[j];
}
std::cout << std::endl;

いくつかの調査を行ったところ、有望に見えるこの質問が見つかりましたが、宣言を からchar f[]に変更char *fすると、 で SEGFAULT になりcinconst char *fコンパイルさえしませんでした。

私はここでやみくもに手探りしてcinおり、および/またはchar配列を正しく使用する方法についてのガイダンスをいただければ幸いです。

私の質問を繰り返します:出力が明示的に値を再割り当てしていないのに、なぜこのように変化するのですか?std::cout << f << std::endl;

4

3 に答える 3

9
char f[]="", c[]="";

と同等です

char f[1]="", c[1]="";

fつまり、 と の両方をc1 文字の配列として宣言します (つまり、 NULor \0、null ターミネータ)。

言い換えれば、あなたは両方の配列を最後まで読み込んでいます.これは完全に機能する可能性があり、(ご覧のように)非常に奇妙なことを行う可能性があります, クラッシュする可能性があります.

于 2012-07-08T06:06:48.640 に答える
0
#include < iostream >

int main() {
    char f[]="";
    char c[]="";

これらを試してみてください、それは私のために問題を解決します;D

于 2014-11-30T18:56:39.437 に答える
0

関数を使用する必要があるようですgetline。それには2つのバージョンがあります...

1 つは C++ 標準ライブラリにあり、次のように使用されます。

std::string s;
// the following returns the stream that you give
// (the cast is non-functional, it's there to show the type)
(istream&)getline(cin, s);

オブジェクトは、string受け取ったものを保持するために動的にサイズを変更するため、これに適しています。

もう 1 つgetlineは標準 C ライブラリにあり、少なくとも Mac OS X では (より多くの場合に実行man 3 getlineされます)、FILE*ストリームの代わりに使用されます。そのバージョンは、必要に応じて配列を動的に再割り当てできcharますが、そのように使用する必要はありません。

于 2012-07-08T06:15:21.473 に答える