1

私はシェルを作成しており、キーボードからstdinを指定してgetline()を使用してコマンドを実行しています。ただし、入力のトークン化に問題があります。strtok()関数の区切り文字として\ nを使用しようとしましたが、機能していないようです。

たとえば、ユーザーが「exit」と入力したかどうかを確認するためのifステートメントを含めました。この場合、プログラムは終了します。終了していません。

これが私が使用しているコードです:

void main() {
int ShInUse = 1;
char *UserCommand;   // This holds the input
int combytes = 100;
UserCommand = (char *) malloc (combytes);
char *tok;

while (ShInUse == 1) {
   printf("GASh: ");   // print prompt
   getline(&UserCommand, &combytes, stdin);
   tok = strtok(UserCommand, "\n");
   printf("%s\n", tok);

   if(tok == "exit") {
      ShInUse = 0;
      printf("Exiting.\n");
      exit(0);
   }
}
4

2 に答える 2

3
if (tok == "exit")

tokexitはポインタなので、2つのポインタを比較しています。それらは同じ集合体に属していないため、これは未定義の動作につながります。

これは文字列を比較する方法ではありません。むしろ使用してくださいstrcmp

 if (strcmp (tok, "exit") == 0)
于 2013-02-27T15:17:42.410 に答える
0

@Kirilenko が述べたように、== 演算子を使用して文字列を比較することはできません。

しかし、それだけではありません。getline()を使用している場合、getline() は 1 行しか読み取らないため、入力を行に分割する必要はありません。また、入力を他の区切り文字に分割したい場合は、NULL が返されるまでループ内で strtok() を呼び出す必要があります。

于 2013-02-27T15:24:09.987 に答える