2017-01-21 1 views
2

私は以下のコードを使用してユーザー入力を受け取り、それを文字列exitと比較して、ユーザーがそれを入力してゲームを終了できるようにしますコマンドラインに入力します。しかし、exitとの比較で*bufferを使用しないと動作しません。これは、exitの最初の文字を指しているためです。問題は、eで始まるすべての単語が私のwhileループを終了させることを意味します。getline()でユーザー入力を行い、whileループ内の別の文字列と比較する

#include<stdio.h> 
#include<stdlib.h> 

int input(char *s, int length); 

int main(){ 

    char *buffer; 
    size_t bufsize = 32; 
    size_t characters; 

    do{ 
     buffer = (char *)malloc(bufsize * sizeof(char)); 

     if(buffer == NULL){ 
      perror("Unable to allocate buffer"); 
      exit(1); 
     } 

     printf("Enter a command: "); 
     characters = getline(&buffer, &bufsize, stdin); 
     printf("%zu characters were read.\n", characters); 
     printf("You typed: '%s' \n",buffer); 

    }while(buffer != "exit"); 
} 
+0

'バッファ= "終了"':これらの点を考慮すると

、あなたはこのようにあなたのコードを構築することができます。検索エンジンを使って 'malloc()'の戻り値をキャストすべき理由を調べてください。2. 'main()'関数を正しく宣言する方法。 – babon

+0

'getline()'はバッファに改行を格納するので、それを比較文字列に含めるか、またはそれをオフにする必要があります。 – Dolda2000

+0

それを指摘してくれてありがとう@ Dolda2000 – babon

答えて

0

Cで

while(strcmpi(buffer, "exit"));

while(buffer != "exit");

を交換し、あなたは==または!=演算子で文字列の論理等価性をチェックすることはできません。あなたは 'strcmp'やstrcmpiのような関数を使う必要があります。

+0

注: 'strcmpi()'は標準のC関数ではありません。 – chux

+0

@chux、そうですね、私はstrcmpとstrcmpiの両方をオプションと言いました。 'strcmpi'がOPのCライブラリで利用できない場合、' strcmp'を使うことができます。それにもかかわらず注目に値する。 – VHS

+0

@GovindParmar、編集していただきありがとうございます。 – VHS

1

buffer != "exit" - >(strcmp(buffer, "exit\n"))

0

あなたは==と文字列を比較する場合は、文字列のみの実際の内容の文字列のベースアドレスを比較し、されていません。文字列を比較するにはstrcmp<string.h>から使用してください。あなたは、声明ではなく、これをする必要がありながら:

while (strcmp(buffer, "exit")); 

注:あなたはまた、あなたのコード内で-Wall -Wextraでコンパイルする必要があり、あなたは文字列を比較する==を使用して、いくつかの警告を見ているだろう。

getlineはと似てfgetsに、バッファの末尾に\nを追加しかし、あなたはこの\n文字を削除する必要がある場合があります。これにより、コードが意図したとおりに動作するようになります。そうでなければ、あなたのコードは、実際にこれをやっている:"exit"strcmp()として、発見された場合にループを終了することはできません

while (strcmp("exit\n", "exit")); 

は同じ文字列を0を返します。

getline()でエラーをチェックする必要があります。これは、行の読み取りに失敗した場合に-1を返します。また、getline()は、バッファのアドレスを*bufferに格納するので、この場合はmalloc()でメモリを割り当てる必要はありません。関数getline()は、基本的にあなたのためにメモリを割り当てます。したがって、この場合は自分自身で行うことは冗長です。これを言ったら、ある時点でfree()このバッファが必要です。詳細はman pageを参照してください。 ! - > `(のstrcmp(バッファ、 "出口"))`

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void){ 
    char *buffer = NULL; 
    size_t buffsize; 
    ssize_t read = 0; 
    const char *exits = "exit"; 

    while (1) { 
     printf("Enter a command: "); 

     read = getline(&buffer, &buffsize, stdin); 
     if (read == -1) { 
      printf("Failure found from getline()\n"); 
      exit(EXIT_FAILURE); 
     } 

     if (read > 0 && buffer[read-1] == '\n') { 
      buffer[read-1] = '\0'; 
     } 

     if (!*buffer || strcmp(buffer, exits) == 0) { 
      break; 
     } 

     printf("%zu characters were read.\n", read); 
     printf("You typed: '%s' \n", buffer); 

     free(buffer); 
     buffer = NULL; 
    } 

    return 0; 
} 
関連する問題