0

私は単純なエラーを抱えています。このプロジェクトは、基本的なメニューのスケルトンを作成することです。新しいコマンドは、1 からユーザーが入力した整数までカウントします。続行する前に、.cpp ファイルを保持するペーストビンへのリンクを投稿しました:
http://pastebin.com/pAi9EiEi

プログラムの残りの部分が実行され、機能します。ただし、エラーは単純です。コマンドを入力するとすぐにクラッシュします。エラー チェックを実行した後、エラーが while ではなく if ステートメントであることがわかりました。エラーは次のような行にあります。

if (stricmp(strstr(newCommand, cmd2), newCommand) == 0)

この行が行うことになっているのは、cmd2 にあるものをコピーして newCommand に入れ、感度を制限せずに比較することです。

char newCommand[] = "new";
4

2 に答える 2

3

「この行が行うことになっているのは、cmd2 にあるものをコピーして newCommand に入れてから、感度をキャップせずに比較することです:」

コードがこれを行うと、 の以前の内容cmd2をそれ自体と比較することになりますよね?

copy cmd2 -> newCommand
is cmd2 == newCommand?

ユーザーが「open」と入力すると、ループの最初の繰り返しで「open」が「newCommand」にコピーされ、プログラムのどこにも文字列「new」がなくなります。

strstr最初の文字列で 2 番目の文字列を検索します。

strstr("hello world", "world"); // returns pointer to 'world' in 'hello world'
strstr("biscuit", "new");  // returns NULL to indicate new doesn't occur in 'biscuit'

確かにあなたが実際にやりたいことは単純です:

if (stricmp(newCommand, cmd2) == 0) {
    // match
}

ちなみに、 「cmd2」を「newCommand」にコピーたい場合はstrcpy(destinationStr, sourceStr)、 ;を使用することをお勧めします。

strcpy(newCommand, cmd2);
于 2013-11-04T20:54:18.927 に答える
2

その行はあなたが思っていることをしません

http://www.cplusplus.com/reference/cstring/strstr/

newcommand で cmd2 の出現を検索し、それへのポインターを返します (見つからない場合は null)。間違っていない限り、stricmp で null を渡すことは未定義の動作です。

単純な stricmp が必要なだけで、コピーを廃止する

于 2013-11-04T20:17:19.287 に答える