

C言語初心者です.以下はバグのあったコードです.

[code]

    #include <stdio.h>
    int main(void){
        int repeat;
    
        int value1 = 0;
        int value2 = 0;
    
        int v;
        int add;
        char command[10];
    
        char str[3];
        scanf("%d", &repeat);
    
        int i;
        for (i=0; i<repeat; i=i+1){
            scanf("%s %d %d",&command, &v, &add);
            if (command == "SET"){
                if (v == 1){
                    value1 += add;
                    printf("%s %d %d\n", command, value1, value2);
                    //ここで,addが例えば,SET 1 10と入力するとadd==1となる.しかも,value1==-1となる.(value1+=addのはずが,逆に引き算される.)
                }
                else{
                    printf("%d", v);
                    value2 += add;
                    printf("%s %d %d\n", command, value1, value2);
                    //ここで,例えば,SET 2 20と入力するとvalue1にadd==2が引き算されてvalue1==-3になる.
                }
            }
            else if (command == "ADD"){
            ここから下は省略.
    
[/code]

これらのバグが起きる原因が分かりません.  
この一連のバグの原因はaddにあると思われるのですが,詳しく教えていただけないでしょうか?


CC BY-SA 4.0
2019-12-09T05:50:06.320
61256
2019-12-09T06:07:59.860
2019-12-09T05:53:42.943
3060
36992
question
c
C言語の基本的なコードのバグ


とりあえずchar [] の比較を==でしているのは気になる。  
C言語ならstrcmpとかでは？

デバッガでちゃんと問題の箇所を実行しているか確認してみるのがいいかと思います。


CC BY-SA 4.0
2019-12-09T06:02:06.377
61257
2019-12-09T06:02:06.377
18637
61256
answer

[code]

    char command[10];
    
    scanf("%s %d %d",&command, &v, &add);
    
[/code]

`scnaf`の`%s`が要求するのは文字列の先頭アドレスです。`&command`は先頭アドレスを格納した変数のアドレスとなっています。正しくは`command`です。

たいていのコンパイラーであれば、引数が正しく指定されていない旨を警告してくれるはずです。[wandbox](https://wandbox.org/permlink/pgTYeDACVQ735wN0)

[code]

    prog.c: In function 'main':
    prog.c:17:17: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[10]' [-Wformat=]
       17 |         scanf("%s %d %d",&command, &v, &add);
          |                ~^        ~~~~~~~~
          |                 |        |
          |                 char *   char (*)[10]
    prog.c:18:21: warning: comparison with string literal results in unspecified behavior [-Waddress]
       18 |         if (command == "SET"){
          |                     ^~
    
[/code]

（Jogenaraさんの指摘されているように文字列比較もおかしいです。）


CC BY-SA 4.0
2019-12-09T06:07:59.860
61258
2019-12-09T06:07:59.860
4236
61256
answer