0

文字列を読み取り、それを 3 つの部分に分割するこのプログラムがあります。最初の部分はオペコード、2 番目はデータ、3 番目はキーです。

使用例:

put this is stackoverflow

opcode: put 
data: this is
key: stackoverflow

コードメイン:

 int main(int argc, char **argv){
          char command[MAX_MSG];
          fgets(command, sizeof(command), stdin);
          char *data;char *key;
          command[strcspn (command, "\n")] = '\0';
          char *aux_command_key = strdup(command);
          char *aux_command_data = strdup(aux_command_key);
          char *opcode = strtok(command, " ");          
          int success = 0;

          if(strcmp(opcode, "put") == 0){
                key = strdup(getKey(aux_command_key, opcode));
                if(key == NULL){
                       printf("Invalid number of arguments.\n");
                       return -1;
                 }

                 else
                       data = getData(aux_command_data, opcode, key);
          }
          printf("opcode: %s\n",opcode);
          printf("data: %s\n",data);
          printf("key: %s\n",key);               
          free(aux_command_key);
          free(aux_command_data);
}

私の問題は、キーなしでプログラムを実行すると、「引数の数が無効です」ではなく、結果としてセグメンテーション違反が発生することです。なぜこれが起こっているのかわかりません。ありがとう。

4

2 に答える 2

0

キーを指定せずにプログラムを実行すると、おそらくgetKey(aux_command_key, opcode)が返されNULLます。

strdup()引数が有効な文字列ポインタでない場合、未定義の動作をします。(つまり、null ポインターを に渡さないでくださいstrdup())。

POSIX 標準は、一般的なライブラリ関数について次のように述べています (C 標準には同様の言語がstrdup()ありますが、C 標準ではなく POSIX の一部です)。

2.1.1 機能の使用と実装

以下の各ステートメントは、以下の詳細な説明で特に明記されていない限り、すべての機能に適用されます。

  1. 関数の引数に無効な値 (関数のドメイン外の値、プログラムのアドレス空間外のポインター、または null ポインターなど) がある場合、動作は未定義です。

...

ドキュメントで特定の無効な値が処理されると明示的に述べられていない限り、引数は有効でなければならないと仮定することは、ほとんどすべての API で従うべき経験則です。参照: 「プログラミングの基本原則 - 関数パラメータとその使用方法」

于 2013-10-31T21:38:18.657 に答える
0

getKey命令で呼び出していputますが、入力に十分な数の引数を指定しなかったと言います。したがって、getKeyが戻るように見えますNULLstrdupで呼び出すことはできませんNULL

私のアドバイス: まず、 を呼び出しgetKeyてから、 が返されない場合は、それNULLを複製できます。

  if(strcmp(opcode, "put") == 0){
        key = getKey(aux_command_key, opcode);
        if(key == NULL){
               printf("Invalid number of arguments.\n");
               return -1;
         }
        else {
               key = strdup(key);
               data = getData(aux_command_data, opcode, key);
         }
  }
于 2013-10-31T21:40:05.723 に答える