0

ユーザー入力を取得して、スペースで区切られた cstring の配列に入れようとしています。配列を画面に出力しても何も得られません。私は何かばかげたことをしていると確信していますが、しばらくの間、さまざまな方法を試していました。どんな助けでも大歓迎です。これがコードです。

#include <iostream>
#include <cstring>

using namespace std;

void stuff(char command[][25], int length)
{
    char ch;


    for(int i = 0; i < length; i ++)
    {
        int b = 0;
        cin.get(ch);
        while(!isspace(ch))
        {
            command[i][b++] = ch;
            cin.get(ch);
        }

        command[i][b] = '\0';
        cout << endl;
    }


}

int main()
{
    char cha[10][25];
    char ch;
    int len = 0;
    while(ch != '\n')
    {
        cin.get(ch);
        if(isspace(ch))
            {
                len++;
            }
    }
    stuff(cha,len);
    for(int i = 0; i < len; i++)
    {
        cout << cha[i] << endl;
    } 
    cout << len << endl;

    return 0;
}
4

2 に答える 2

2

a)最初に。でテストしたとき、chは未定義ですwhile (ch != '\n')。ゼロか何かに初期化します。

b)whileループではchaに値を書き込みません。おそらく次のようなものです:

int pos = 0;
while(ch != '\n') {
    cin.get(ch);
    if (isspace((unsigned)ch)) {
       if (pos > 0) {
           ++len;
           pos = 0;
       }
    }
    else {
       cha[len][pos] = ch;
       ++pos;
    }
}

c)でストリームを再度読み取っていますがstuff(...)、でストリームから取得したいものをすでに消費していますmain()

d)このコードは、多くのバッファオーバーランとスタック破損の機会に悩まされています。おそらくstd::vector<std::string>代わりに使用してください。メモリが不足すると、スタックを混乱させるのではなく、例外をスローします。おそらくこのようなもの(テストされていない):

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

using namespace std;

void main()
{
    typedef std::vector<std::string> strvec;
    strvec cha;
    std::string s;
    char ch = 0;
    while(ch != '\n') {
        cin.get(ch);
        if (isspace((unsigned)ch)) {
            if (!s.empty()) {
                cha.push_back(s);
                s.clear();
            }
        }
        else {
            s.push_back(ch);
        }
    }
    // don't need to call 'stuff' to null terminate.
    for (strvec::iterator i = cha.begin(); i != cha.end(); ++i) {
        cout << *i << endl;
    }
    cout << cha.size() << endl;
}

これは実際よりも少し効率的かもしれませんが、うまくいけば理解しやすいでしょう。

于 2012-12-11T09:31:16.693 に答える
0

メインのwhileサイクルで入力全体を読み取って長さ(文字列の数)を読み取りますが、それを保存することはありません。後でstuff cin.get何も読みません。最初のサイクルで入力を cha に保存することはできますか?

于 2012-12-11T09:15:11.813 に答える