1

重複の可能性:
C で文字列を正しく比較するにはどうすればよいですか?

私はこのトピックについて何ヶ月も座っていましたが、C には比較的慣れていません。簡単な質問/応答プログラムを作成しようとしています。if else 条件 (他のすべてが機能する) と関係があることはわかっていますが、検索しても問題が見つからないようです。最後にプログラムを繰り返す再帰もあります。その中に入れた関数呼び出しが間違っている可能性があります。

#include <stdio.h>

main()
{
    char line[100];
    char decision[100];
    printf("Are you gonna throw it?\n");
    printf("Type yes or no.\n");

    scanf("%s", line);
    printf("%s \n", line);

    if (line == "yes") {
        printf("Thanks.\n");
    } else if (line == "no") {
        printf("Why not?\n");
    }

    printf("Do you want to do this again?\n");
    scanf("%s", decision);
    if (decision == "yes") {
        main();
    };
}
4

5 に答える 5

2

のような比較はline == "yes"機能しません。strcmp を使用して文字列を比較する必要があります。

if (strcmp(line, "yes") == 0) {
    printf("Thanks.\n");
} else if (strcmp(line, "no") == 0) {
    printf("Why not?\n");
}
于 2012-09-24T17:17:31.767 に答える
1

文字列を比較するには、string.h を使用するstrcmpstrncmp、string.h から関数を作成する必要があります。

他の問題は次のとおりです。

main返すべきintです。

int main()

また

int main(int argc, char *argv[])

または同等のものは、C の main の適切な署名です。

于 2012-09-24T17:18:05.153 に答える
0

この場合、再帰は必要なく、プログラムの反復ごとに不必要にスタックにデータを蓄積します。代わりに、コード全体をdo {...} while (strcmp(decision, "yes") == 0)ループで囲みます。またline == "yes"、とline == "no"に変更strcmp(line, "yes") == 0strcmp(line, "no") == 0ます。

于 2012-09-24T17:22:25.593 に答える
0

最初に知っておくべきこと: 文字列リテラルは や のよう"yes""no"配列です。"yes"型は「4 要素配列char」です (0 ターミネータの場合は 1 つ追加)。

2 番目に知っておくべきこと: ほとんどの場合、「N 要素配列T」型の式は「ポインタT」型の式に変換され、その値は配列の最初の要素のアドレスになります。

を書くと、とif (line == "yes")の両方の式が "array of " 型から "pointer to"型に変換され、それらの値は最初の要素のアドレスになり、これは異なります( areの内容があったとしても、文字列リテラルは生きています)とは別の住所)。したがって、 の内容に関係なく、比較は常に失敗します。 line"yes"charcharline"yes" "yes"lineline

2 つの配列式の内容を比較するには、標準ライブラリ関数を使用する必要がありますstrcmp

if (strcmp(line, "yes") == 0) { ... }

strcmp2 つの文字列が等しい場合は 0 を返し、辞書式に より小さい場合lineは< 0 を返し、辞書式に より大きい場合は > 0を返します。 "yes"line"yes"

于 2012-09-24T17:26:48.867 に答える
0

1) ここでセミコロンを削除します。

if (decision == "yes")
{
     main();
 }; //<-- if you want to keep this code at all

2) == を使用して文字列を比較することはできません

strcmp(decision, "yes"); //returns 0 if they are equil

3) main() を再帰的に呼び出すのはなぜですか? すべてをループに入れないのはなぜですか:

main() { 
  char line[100];
  char decision[100] = "yes";
  while(!strcmp(decision, "yes")){
    printf("Are you gonna throw it?\n"); 
    printf("Type yes or no.\n");
    scanf("%s", line);  
    printf("%s \n", line);  
    if (!strcmp(line, "yes"))
      printf("Thanks.\n");   
    else if (!strcmp(line, "no"))     
      printf("Why not?\n");   

    printf("Do you want to do this again?\n");
    scanf("%s", decision); 
  } //end while
} //end main
于 2012-09-24T17:27:12.823 に答える