2017-03-18 19 views
0

入力したテキストを表示する小さなcプログラムを作成しました。入力されたテキストが "show version"の場合、バージョンが表示されます。ここ は、それがすべてのチャー+ 1のためにV1を印刷するサンプルコードStrcmpとgetchar

#include<stdio.h> 
#include<string.h> 
void main(){ 
int i; 
char j = (char) i; 
while(i != '#'){ 
i = getchar(); 
if(strcmp(&j, "show version")) printf("v1"); 
else putchar(i); 
}} 

あります。 提案があります。

+0

'j'の値は不明です。' i'を変更した後に 'i'を' j'に割り当てないため、 'i'を設定すると変更されません。また、 'strcmp()'はヌルで終了する文字列を期待しています...(おそらく)ヌルでない 'char'へのポインタは十分ではありません - ヌル文字を見つけるまで、ストリングが一致しないと判断した。言い換えれば、未定義の動作が多く、言語の仕組みに関する誤解があるように見えます。 – Dmitri

答えて

0

man pages for strcmpをお読みください。

strcmpの戻り値は、両方の文字列がC状態にと同等と考えられる、等しい場合0あります。

は、以下にごif..statementを変更

if(strcmp(&j, "show version") == 0) printf("v1"); 

注:ために文字列を解析するためにあなたのコードのために、あなたは、文字列に読み出された各文字を追加する必要があります。 fgetsも入ったときに、キー/改行文字を入力キャプチャするため

#define LINE_SIZE 512 

int main(){ 
    char *line = malloc(LINE_SIZE); 
    while(fgets(line, LINE_SIZE, stdin)) { 
     if(strncmp(line, "show version", strlen(line) - 1) == 0) { 
      printf("v1\n"); 
     } else { 
      continue; 
     } 

     break; 
    } 

    return 0; 
} 

(というよりstrcmp)私はstrncmpを使用する理由とstrlen(line) - 1です。これは単なる例です - あなたの記憶を解放することを忘れないでください!

+0

(元のコードで) '&j'はヌル終了文字列を参照しておらず、' j'の値は初期化されていない変数?あるいは、 'j'はループの中で変更されていません(' i'だけです)? – Dmitri