0

5 文字未満をロードする場合は問題ありません。しかし、5 文字を超える文字をロードすると、プログラムがクラッシュします。その前にどうやって守る?

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    char tab[5];
    int tab2[5];
    char *wsk = tab;
    int i = 0;

    cin >> tab;
    while (true)  {
        cin >> tab2[i];
        if (tab2[i] == 0) break;
        i++;
    }

    i = 0;
    while (true) {
        if (tab2[i] ==0) break;
        wsk += tab2[i];
        cout << *wsk;
        i++;
    }
    return 0;
}
4

5 に答える 5

2

5 に制限し
たくありません。本当に必要なのは、読み取りが機能し、クラッシュしないことを確認することです。

5 文字で読み取りを停止したくない理由は、ユーザーが 5 文字を超えて入力した場合、入力の途中で読み取りを停止し、この入力の終わりを見つけて続行するコードを記述する必要があるためです。 . 入力ストリームを修正するコードを書くのは難しいです。むしろ、入力検証を行います (ユーザーががらくたを入力した可能性があり、エラー メッセージを生成することができます) が、次の入力操作のために読み取りを続行するための正しい場所にいます。

char tab[5];
cin >> tab;   // Fails if you read more than 4 input characters
              // (because it will add '\0' on the end)

自己拡張型の宛先構造を使用してみませんか。

std::string tab;
std::cin >> tab;  // Read one word whatever the size.

しかし、配列はどうですか。
もう難しいことはありません。ここでは、サイズを変更する配列が必要です。std::vector があると思います

int tab2[5];
while (true)  {
    cin >> tab2[i];  // Fails on the 6 number you input. 
    // STUFF
}

ループは次のように記述できます。

std::vector<int> tab2;
while (true)  {
    int val;
    cin >> val;
    tab2.push_back(val); 
    // STUFF
}
于 2013-10-27T16:32:00.177 に答える
1

それ以外の:

while (true)

置く:

while (i < 5)
于 2013-10-27T16:17:54.193 に答える
0

C スタイルの配列の場合、入力ストリームの幅をバッファーに割り当てられた文字数に設定する必要があります。そうしないと、配列の末尾を超えて書き込み、バッファー オーバーフローが発生する可能性があります。これは通常、次を使用して行われios_base::widthます。

std::cin.width(5);
std::cin >> buffer;

マニピュレータを使用することもできますstd::setw:

std::cin >> std::setw(5) >> buffer;

これらは両方とも、ストリームの最大幅を 5 文字に設定します。最初の入力操作の後、幅はデフォルトにリセットされます。

于 2013-10-27T16:35:42.077 に答える