0

どういうわけか、このコードを実行して文字列を入力すると、i=0 の最初の文字列がスキップされ、A[1] から文字列の入力が開始されます。したがって、メモリからのランダムなもので満たされた A[0] になります。誰かが問題を指摘できますか?

cin>>s;
char** A;
A = new char *[s]; 
cout<<"now please fill the strings"<<endl;
for (int i=0;i<s;i++)
{ 
    A[i] = new char[100];
    cout<<"string "<<i<<": ";
    gets(A[i]);
}
4

4 に答える 4

5

そのコードは恐ろしいです。実際の C++ では次のようになります。

#include <string>
#include <iostream>
#include <vector>

int main()
{
    std::cout << "Please start entering lines. A blank line or "
              << "EOF (Ctrl-D) will terminate the input.\n";

    std::vector<std::string> lines;

    for (std::string line; std::getline(std::cin, line) && !line.empty(); )
    {
        lines.push_back(line);
    }

    std::cout << "Thank you, goodbye.\n";
}

newポインターや式がないことに注意してください。

必要に応じて、ループstd::cout << "> " &&内の条件付きチェックの先頭に追加することで、プロンプトの出力を少し追加できます。for

于 2012-12-18T21:37:50.317 に答える
2

おそらく gets() を使用しているからでしょう... gets() を使用しないでください。代わりに fgets() を使用してください。

取得対 fgets

于 2012-12-18T21:34:59.250 に答える
1

おそらく空の文字列が得られます:sフォーマットされた入力を使用すると、数字以外に遭遇するとすぐに停止します。たとえば、入力が終了したことを示すために使用される改行です。gets()、したがって、すぐに改行を見つけて、最初に読み取った文字列を終了します。

とはいえ、絶対に使用しないでくださいgets()。これは主要なセキュリティ問題であり、多くの潜在的な攻撃の根本原因です! 代わりに、fgets()orをs および a とstd::getline()一緒に使用することをお勧めします。また、入力の試行が成功したことを常に確認する必要があります。std::stringstd::vector<std::string> >

if ((std::cin >> s).ignore(std::numeric_limits<std::streamsize>::max(), `\n`)) {
    std::string line;
    for (int i(0); i != s && std::getline(std::cin, line); ) {
        A.push_back(line);
    }
}
于 2012-12-18T21:38:09.563 に答える
1

問題は、必要な番号を取得し、最初の反復で取得した (プレスからの改行)をcin>>s;残すことです。これはそれを修正する最も良い方法ではありませんが、それを証明するために、その行の後に次の行を書きます:\nenterstdingets()

int a = fgetc(stdin);

a後でチェックアウトして、改行があることを確認します。

于 2012-12-18T21:38:09.780 に答える