1

次のコードは、実行すべきではないときに実行されているようです。この例では:

#include <iostream>
using namespace std;
int main()
{
    char data[1];
    cout<<"Enter data: ";
    cin>>data;
    cout<<data[2]<<endl;
}

長さが 1 より大きい文字列 (例: "Hello") を入力すると、配列がそれを保持するのに十分な大きさであるかのように出力されます (例: "l")。配列よりも長い値を格納しようとしたとき、または配列の長さよりも大きいインデックスを持つ値を取得しようとしたときに、これはエラーをスローするべきではありませんか?

4

3 に答える 3

3

次のコードは、実行すべきではないときに実行されているようです。

「すべき」とか「すべきでない」という話ではありません。それは「かもしれない」「そうでないかもしれない」についてです。

つまり、プログラムが実行される場合と実行されない場合があります。

これは、プログラムが未定義の動作を呼び出すためです。配列の長さを超えて配列要素にアクセスすると、未定義の動作が発生します。つまり、何かが起こる可能性があります。

コードを記述する適切な方法は、次のように使用することstd::stringです。

#include <iostream>
#include <string>

//using namespace std;  DONT WRITE THIS HERE

int main()
{
    std::string data;
    std::cout<<"Enter data: ";

    std::cin>>data; //read the entire input string, no matter how long it is!

    std::cout<<data<<std::endl; //print the entire string

    if ( data.size() > 2 ) //check if data has atleast 3 characters
    {
         std::cout << data[2] << std::endl; //print 3rd character 
    }
}
于 2012-06-12T07:48:54.357 に答える
1

ドキュメントによると、そのコードを実行すると未定義の結果が得られるため、コンパイルまたは他のマシンでコンパイルされたさまざまなパラメーターでクラッシュする可能性があります。

于 2012-06-12T07:50:50.953 に答える
1

これを行うのは安全ではありません。それが行っているのは、たまたまバッファの後にあるメモリを上書きすることです。その後、それを読み返します。

これはcincout操作が次のように言っていないため、機能しているだけです。これは1つの文字へのポインターです。1つの文字のみを書き込みます。代わりに、「書き込みに十分なスペースが割り当てられています」と表示されます。cinおよび操作はcout、ヌル ターミネータに到達するまでデータを読み取り続けます\0

これを修正するには、これを次のものに置き換えることができます。

std::string data;

C++ を使用すると、大きなメモリ ミスを犯す可能性があります。

ほとんどの時間を節約するいくつかの「ルール」:

1:使用しないでくださいchar[]。代わりに を使用しますstring

2:引数の受け渡しにポインタを使用しないでください。参照渡し、値渡し。

3:配列を使用しないでくださいint[](例: )。を使用しvectorsます。自分の境界を確認する必要があります。

これら 3 つだけで、ある程度「安全な」コードと非 C ライクなコードを作成できます。

于 2012-06-12T07:53:15.403 に答える