2016-05-17 8 views
-2
#include "stdlib.h" 
#include "stdio.h" 
#include "string.h" 
#include "termios.h" 

int main (int ac, char* av[]) { 
    struct termios ttyinfo; 
    int result; 

    result = tcgetattr(0, &ttyinfo); 
    if (result == -1) { 
    perror("cannot get params about stdin"); 
    exit (1); 
    } 

    if (av[1] == "stop" && av[2] == "A") { 
    printf ("Stop: ^%c\n", ttyinfo.c_cc[VSTOP] - 19 + 'A'); 
    } 
    if (av[1] == "start" && av[2] == "^Q") { 
    printf ("Stop: ^%c\n", ttyinfo.c_cc[VSTOP] - 3 + 'A'); 
    } 
    return 0; 
} 

私はLinuxを学んでおり、このコードはCで書かれています。コマンドラインを使って文字の変更を表示します。例:./example stop A.ただし、画面には何も表示されません。なぜこのプログラムは何も印刷しないのですか?

+0

['strncmp'](http://en.cppreference.com/w/c/string/byte/strncmp)を使って等価性(' == 'ではなく)をテストするので、' print'しません。 –

+0

また、文字列の比較を行った後でも、探している引数の2つの組み合わせの1つを渡さないと、プログラムは何も印刷しません(何も印刷しないことが珍しくないかもしれません)。最後に、2つよりも少ない引数がプログラムに渡されると、予期せず動作します。おそらくクラッシュします。 –

+0

'=='文字列上では単にアドレスを比較するので、あなたの場合は比較が失敗します。実際の文字列を比較するには、 'strcmp'を呼び出す必要があります。 –

答えて

3

Cを使用しているときに警告をオンにする必要があります。なぜこれが失敗するのかが分かります。あなたはクラン

gcc -Wall -std=c11 -pedantic goo.c 

でそれをコンパイルするためにこれを使用した場合は、これらのエラーを持っているでしょう:

goo.c:19:13: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] 
if (av[1] == "stop" && av[2] == "A") 
     ^~~~~~~ 
goo.c:19:32: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] 
if (av[1] == "stop" && av[2] == "A") 
         ^~~~ 
goo.c:24:13: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] 
if (av[1] == "start" && av[2] == "^Q") 
     ^~~~~~~~ 
goo.c:24:33: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] 
if (av[1] == "start" && av[2] == "^Q") 

あなたは文字列比較関数を使用して文字列を比較する必要があります。 ==を使用して文字列を比較することはできません。

#include "stdlib.h" 
#include "stdio.h" 
#include "string.h" 
#include "termios.h" 

int main (int ac, char* av[]) 
{ 
    struct termios ttyinfo; 
    int result; 
    result = tcgetattr(0, &ttyinfo); 
    if (result == -1) { 
    perror("cannot get params about stdin"); 
    exit (1); 
    } 

    if(ac > 2) { 
    if (strcmp(av[1], "stop") == 0 && strcmp(av[2], "A") == 0) { 
     printf ("Stop: ^%c\n", ttyinfo.c_cc[VSTOP] - 19 + 'A'); 
    } 
    if (strcmp(av[1], "start") == 0 && strcmp(av[2], "^Q") == 0) { 
     printf ("Stop: ^%c\n", ttyinfo.c_cc[VSTOP] - 3 + 'A'); 
    } 
    } 
    else { 
    printf("Need two arguments\n"); 
    } 
    return 0; 
} 

strncmpstrcmpにまで読む代わりにこのような何かを試してみてください。特に、strncmpがなぜstrcmpよりも好ましいのかを知っていることを確認してください。

+0

ありがとう、ありがとう! – Fed

+0

'gcc'は' clang'のエイリアスのプラットフォームは何ですか? –

+0

@ElliottFrisch Mac。実際のgccを実行したい場合は、それを指定する必要があります。私のシステムでは 'gcc-5'です。 [OS X 10.9 gccからclangへのリンク](http://stackoverflow.com/questions/19535422/os-x-10-9-gcc-links-to-clang)私はあなたが実装でいくつかの興味深い違いを見ることができます。つまり、異なるエラーメッセージと異なる最適化が最も顕著な2つです。 – Harry

関連する問題