2016-07-09 18 views
0

ユーザーがyなどを入力したかどうかを確認しようとしています。ユーザー入力が特定の文字かどうかを確認する方法

私は文字列を作成しようとしましたが、ユーザーが入力したものをループしてみましたが、うまくいきません。

char answer[] = "n"; 
for(int i = 0; i < sizeof(answer)/4; i++) { 
    if(answer[i] == "y") { 
     calculatorPrompt(); 
    } else if(answer[i] === "n") { 
       printf("Okay, bye!"); 
       System(100); 
    } 
} 

これは私のコード(私はそれがif文でクラッシュすると確信している)である:

printf("Thanks for that\nDo you want a calculator?(y/n)"); 
char answer = 'n'; 
scanf("%s", answer); 
    if(answer == 'y') { 
     calculatorPrompt(); 
    } else if(answer == 'n') { 
     printf("Okay bye!"); 
     Sleep(100); //wait for 100 milliseconds 
    } 

calculatorPrompt()機能:

void calculatorPrompt() { 
int a = 0; 
int b = 0; 
int sum = 0; 
printf("Enter your first number: "); 
if(scanf("%d\n", a) != 1) { 
    checkNumber(); 
} else { 
    printf("Enter your second number: "); 
    if(scanf("%d\n", b) != 1) { 
     checkNumber(); 
    } else { 
     sum = calculate(a, b); 
     printf("Your answer is: %d", sum); 
    } 
} 

} 

calculate()機能:

int calculate(int a, int b) { 
    return a + b; 
} 

checkNumber()機能:

void checkNumber() { 
    printf("Really? You didn't enter a number... Now exiting.."); 
    return; 
} 

私は、私もそれがクラッシュした理由として困惑している<windows.h> <stdio.h><stdbool.h>

が含まれています。

プログラムの戻り値は-1,073,741,819です。

+0

詳細を入力してください。クラッシュは非常に良い説明ではありません。 –

+3

あなたは[** 'scanf()' **](http://en.cppreference.com/w/c/io/fscanf)の仕組みを研究していないので、クラッシュします。ヒント: 'scanf("%s "、answer)'、 'answer'は単に' char'ですが、正しくありません。実際、投稿されたコードの 'scanf'の使用法の* none *は正しいので、それを使用する前にそれについて学ぶことをお勧めします。 – WhozCraig

+0

チップのおかげで、私はscanfについてもっと研究します。 – aparms

答えて

2

あなたは、コード内のscanf()文で複数の問題があります。これは間違っている

if(scanf("%d\n", a) != 1) //wrong : sending variable as argument 
  • :あなたが使用してコードのcalculatorPrompt()目的球、中

    • address of the variableをaとして送信する必要があるためです引数としてvariable自体を指定しないでください。

      if(scanf("%d", &a) != 1) //correct : sending address as argument 
      
    • コード内の他integersを走査しながら、同様に変化します。ここ


    char answer = 'n'; 
    scanf("%s", answer); 
    
    • 間違った書式指定を使用しているように、これは未定義の動作を呼び出します。answerので、ここで

    • 代わりに使用するので、charです:

      scanf(" %c", &answer); //space to avoid white spaces 
      

    と私はすでにコメントで提案してきたように:

    • あなたがでi < sizeof(answer)/4を使用forループ

    いいえ!それはあなたがどんな文字列を持っていない方法でi < sizeof(answer)、すべての要素だけ1バイトを占有している文字列のようではない4(あなたがint配列のためにそれを勘違いしている)

    でなければなりませんあなたのコードで

    +1

    ^:)&なぜ 'scanf("%s "、answer);'が悲惨なのかを言及する価値があるかもしれません – sjsam

    +0

    申し訳ありませんが 'printf'のために見落としました。しかし、オペレータが 'printf("%s "、answer);を使用すると、印刷のためにsegフォールトが発生します。 – sjsam

    +1

    はい、それは未定義の動作であり、必ずしもセグメンテーションではありません。 – sjsam

    0

    私は電卓のために書いたコードはお勧めしませんが、実際のコードを見つけるのを助けたいと思っています。自分のコードに基づいて、次のコードを試してみてください。相違点を見て、あなたのケースでプログラムがクラッシュした理由を理解してくれることを願っています。

    #include <Windows.h> 
    #include <stdio.h> 
    #include <stdbool.h> 
    bool checkNumber(int num) 
    { 
        return true; 
    } 
    
    
    int calculate(int a, int b) { 
        return a + b; 
    } 
    
    void calculatorPrompt() { 
        int a = 0; 
        int b = 0; 
        int sum = 0; 
        printf("Enter your first number: "); 
        scanf_s("%d", &a); 
        if (checkNumber(a)) { 
        } 
    
        printf("Enter your second number: "); 
        scanf_s("%d", &b); 
        if (checkNumber(b)) { 
        } 
    
        sum = calculate(a, b); 
        printf("Your answer is: %d", sum); 
    
    } 
    
    int main() 
    { 
        printf("Thanks for that\nDo you want a calculator?(y/n)"); 
        char answer = 'n'; 
        scanf_s("%c", &answer); 
        if (answer == 'y') { 
         calculatorPrompt(); 
        } 
        else if (answer == 'n') { 
         printf("Okay bye!"); 
         Sleep(100); //wait for 100 milliseconds 
        } 
    } 
    
    +0

    あなたが行った変更を説明してください – sjsam

    +0

    1.変数のアドレスを引数2として取るように変更されたscanf 2. scanfの戻り値に基づいてelseブロックがあった場合。そのコードブロックが正しくないように見えました。理想的には、番号の検証を行い、予期しない値を処理する必要があります。したがって、checknumberをifブロックから移動して移動します。希望が役立ちます。 – Kevin

    0
    #include <windows.h> 
    #include <stdio.h> 
    #include <stdbool.h> 
    
    void calculatorPrompt(void); 
    
    int main(void){ 
        printf("Thanks for that\nDo you want a calculator?(y/n)"); 
        char answer = 'n'; 
        scanf("%c", &answer);//scanf need address of store place 
        if(answer == 'y') { 
         calculatorPrompt(); 
        } else if(answer == 'n') { 
         printf("Okay bye!\n"); 
         Sleep(100); //wait for 100 milliseconds 
        } 
        return 0; 
    } 
    
    void checkNumber(void); 
    int calculate(int a, int b); 
    
    void calculatorPrompt() { 
        int a = 0; 
        int b = 0; 
        int sum = 0; 
        printf("Enter your first number: "); 
        if(scanf("%d", &a) != 1) {//\n : skip white spaces and wait input not spaces 
         checkNumber();//call when invalid input 
        } else { 
         printf("Enter your second number: "); 
         if(scanf("%d", &b) != 1) { 
          checkNumber(); 
         } else { 
          sum = calculate(a, b); 
          printf("Your answer is: %d\n", sum); 
         } 
        } 
    } 
    
    void checkNumber(void){//output message and clear input. 
        fprintf(stderr, "invalid input!\n"); 
        scanf("%*[^\n]%*c");//clear upto end of line. 
    } 
    
    int calculate(int a, int b) { 
        return a + b; 
    } 
    
    0

    文字をスキャンするときには、%cを使用する必要があります。文字列を続ける予定の場合は、==ではなくstrcmp()を使って比較する必要があります。

    関連する問題