2

各入力にスペースで区切られたintが含まれている間に、ユーザーから入力を取得するプログラムを作成しています。例:「2 345」。

atoi関数をうまく実装しましたが、文字列を実行してスペースを「スキップ」しようとすると、実行時エラーが発生します。

for(int i=0, num=INIT; i<4; i++)
    {
        if(input[i]==' ')
            continue;

        string tmp;
        for(int j=i; input[j]!=' '; j++)
        {
            //add every char to the temp string
            tmp+=input[j];

            //means we are at the end of the number. convert to int
            if(input[i+1]==' ' || input[i+1]==NULL)
            {
                num=m_atoi(tmp);
                i=j;
            }
        }
    }

'if(input [i + 1] ==''.....'の行に例外が発生します。基本的に、「2 2 22」だけを挿入しようとしています。文字列内の実空間と''を比較すると、例外が発生します。

スペースのASCII値である32と比較しようとしましたが、それも失敗しました。何か案は?

4

2 に答える 2

3

問題は、メインループで文字列の終わりをチェックしないことです。

for(int j=i; input[j]!=' '; j++)

する必要があります:

for(int j=i; input[j]!=0 && input[j]!=' '; j++)

NULLまた、 NUL文字には使用しないでください。'\0'または単にを使用する必要があります0。マクロNULLはポインタにのみ使用する必要があります。

そうは言っても、あなたの場合は、またはそれに類似したものを使用する方が簡単かもしれませstrtolistringstream

于 2012-06-09T13:23:45.253 に答える
2

質問への答えではありません。

しかし、コメントには2つ大きなものがあります。

C ++ストリームライブラリは、スペースで区切られたストリームからintを自動的に読み取り、デコードすることに注意してください。

int main()
{
    int value;
    std::cin >> value; // Reads and ignores space then stores the next int into `value`
}

したがって、複数のintを読み取るには、ループに入れるだけです。

   while(std::cin >> value)   // Loop will break if user hits ctrl-D or ctrl-Z
   {                          // Or a normal file is piped to the stdin and it is finished.
        // Use value
   }

1行を読みます。スペースで区切られた値が含まれているので、行を文字列に読み取ります(これをストリームに変換してから、値を読み取ります)。

   std::string line;
   std::getline(std::cin, line);            // Read a line into a string
   std::stringstream linestream(line);      // Convert string into a stream

   int value;
   while(linestream >> value)               // Loop as above.
   {
        // Use Value
   }
于 2012-06-09T18:01:10.173 に答える