2017-05-05 8 views
0

の可変量の入力をトークン化するにはどうすれば、例えば、ユーザの入力をトークン化しようとしていますload sml.txt。それは2つのトークンを持っているので loadコマンドが正常に動作しますが、私はdisplayのような単一ワードの入力を使用しようとすると、それがクラッシュし、私にセグメンテーションフォルトを与えます。私は、2番目のトークンがNULLであると仮定しますが、この問題を回避する方法はわかりません。手伝ってくれますか?あなたの参照COMMAND_LOAD = "負荷" とCOMMAND_DISPLAY = "表示" のためにここでは言葉

int main(int argc, char **argv) 
{ 
    AddressBookList *addressBookList; 
    char input[BUFSIZ]; 
    char load[BUFSIZ]; 
    char fileN[BUFSIZ]; 
    char *fileName; 
    char *token; 
    showStudentInformation(); 
    do 
    { 
     printf("Enter your command: \n"); 
     fgets(input, sizeof(input), stdin); 
     input[strlen(input) - 1] = '\0'; 
     token = strtok(input, " "); 
     strcpy(load, token); 
     token = strtok(NULL, " "); 
     strcpy(fileN, token); 
     fileName = fileN; 
     if (strcmp(load, COMMAND_LOAD) == 0) 
     { 
      addressBookList = commandLoad(fileName); 
     } 
     else if (strcmp(load, COMMAND_UNLOAD) == 0) 
     { 
      /*commandUnload(fileName);*/ 
     } 
     else if (strcmp(load, COMMAND_DISPLAY) == 0) 
     { 
      if (fileN == NULL) 
      { 
       printf("> No file loaded"); 
      } 
      else 
      { 
       commandDisplay(addressBookList); 
      } 
     } 
     else 
     { 
      printf("> Invalid input\n\n"); 
     } 
    } while (strcmp(load, COMMAND_QUIT) != 0); 
    return EXIT_SUCCESS; 
} 
+0

token'は 'のstrcpy()を呼び出す前に' 'NULL'ある'かどうかを確認します。 – Barmar

+0

'strtok'の戻り値をチェックして、何かをしようとする前にNULLかどうかを調べる必要があります。 –

答えて

2

strtok()戻り、それ以上のトークンがありませんとき、あなたはこれをチェックすることができますNULL。トークンがない場合は、strcpy()の代わりに'\0'を最初の文字に割り当てて、ターゲット文字列を空にします。

do 
{ 
    printf("Enter your command: \n"); 
    fgets(input, sizeof(input), stdin); 
    token = strtok(input, " \n"); 
    if (token) { 
     strcpy(load, token); 
    } else { 
     load[0] = '\0'; 
    } 
    token = strtok(NULL, " \n"); 
    if (token) { 
     strcpy(fileN, token); 
    } else { 
     fileN[0] = '\0'; 
    } 
    ... 
} while (strcmp(load, COMMAND_QUIT) != 0); 

文字列の最後の文字を\0に置き換える必要はありません。 をstrtok()区切り文字に含めるだけで、トークンの末尾に改行を含めません。

+0

この応答に感謝しますが、if文の外でもトークンがどのように保存されますか?それはうまくいきますが、私はC言語の新機能であることを理解しようとしています。 –

+0

トークンが見つかった場合は、 'strcpy()'を使ってそれを変数にコピーします。トークンがない場合は、変数を 'variable [0] = '\ 0';で空の文字列に設定するだけです。 – Barmar