2016-09-16 32 views
-2

私はC++を学び始めました。この単純なプログラムを書いています。間違った番号を入力すると、ユーザーが任意の文字を入力したときにもう一度やり直してプログラムを直接終了してください。どうしてそうなったのですか? `間違った入力がプログラムを終了するC++

#include<unistd.h> 
#include<stdio.h> 


int main(){ 


int a; 
char b ,c; 

start: 


    printf("INPUT ONLY NUMBER 1 : "); 

    scanf(" %d", &a); 

    if(a==1) 
    { 
     printf(" you entered correctly \n"); 
     printf("do you want to try again? <Y> <N> \n"); 
     scanf(" %c", &c); 

     if(c=='Y' ||c=='y') 

     { 
      goto start; 
     } 

    } 
else { 
    sleep (1); 
    printf("wrong number , do you want to try again? <Y> <N> \n"); 
    scanf(" %c" , &b); 



} 

if (b=='Y'||b=='y') 
{ 
sleep(1); 
goto start; 
} 

else 
if(b=='n'||b=='N') 
{ 

sleep(1); 
printf("thank you and goodbye"); 
exit (1); 
} 
} 

`

+0

をユーザーが間違った番号を入力すると、それが正常に動作し、それが唯一の出口ユーザーはので、私は開始している」文字 –

+5

を入力するとC++を学ぶ " - これはCのようで、C++のようには見えません。あなたは正しい本を選んだのですか?とにかく、より良い本を手に入れよう! 'goto'にはそのアプリケーションがありますが、初心者は**これで始めるべきではありません! 1970年代/ 80年代は、構造化されたコードを使い果たしてしまいました!そして、コードを適切にフォーマット&インデントします。 – Olaf

+1

gotoステートメント –

答えて

0

scanf(" %d")
私はあなたの問題は%d前にそのスペースから来て賭けます。試してみてくださいscanf("%d")。後で同じ:scanf(" %c ")の代わりにscanf("%c")です。

とにかく、あなたのコードは非常に汚いです。そして、これはC++ではなくCのように見えます。
ここでマニアックではありませんが、正しくインデントし、gotoをすべて避けてください。あなたのプログラムの構造は単純で、whileループがあなたのためにトリックを行います。明示的にexit(1)を呼び出すことも避けてください。 exitは、主に早期終了を引き起こすために使用されます。あなたの場合、プログラムは正常終了し、main関数のreturn 0で終了する必要があります。

#include <unistd.h> 
#include <stdio.h> 
#include <stdbool.h>  //Reauired to use boolean type in C 

int main() 
{ 
    bool stop = false;  //boolean type only has two states: true and false. Very useful for loops! 
    while(!stop)   //Read as "While we don't need to stop, execute the loop's contents 
    {      //Much easier to read! 
     printf("INPUT ONLY NUMBER 1 : "); 
     scanf("%d", &a); 
     if(a == 1) 
     { 
      printf("you entered correctly \n"); 
      printf("do you want to try again? <Y> <N>\n"); 
      scanf("%c", &c); 

      if(c == 'N' || c == 'n') 
      {     //We only need to tell the loop when to stop 
       stop = true; //by setting stop to true 
      }     //The loop's default behavior is to loop execution of its content 
     } 
     else 
     { 
      sleep(1); 

      printf("wrong number , do you want to try again? <Y> <N> \n"); 
      scanf("%c" , &b); 

      if(b=='n'|| b=='N') 
      { 
       stop = true; //Same as above 
      } 

      sleep(1); 
     } 
    } 

    printf("thank you and goodbye"); 
    return 0; 
} 
-1

タイプintの変数に入力を読みますが、タイプchar*の変数にしないでください。次に、値が小数のみで構成されているかどうかを確認し、必要に応じてintに変換します。

(詩。私は心でこれらのメソッドかかわら知りませんが、それらをGoogleに難しいことではありません)

0

あり、時にはあなたがそれをフラッシュすることをクリーンアップすることができ、あなたのscanfから忘れ物は、ですが、あなたのコードでは動作しないようです。 基本的にあなたのアプローチが動作しない場合、その後、あなたはそれを変更する必要があることを示していますhttp://c-faq.com/stdio/stdinflush2.html

その問題を見てみた本は出くわします。 、あなたもそう、そこにあなたの質問の一つにしばらくについて ・ホープ、この助けを求めて:

#include <iostream> 

int main(){ 

    char input; 
    char try_again; 

    do { 
     std::cout << "INPUT ONLY NUMBER:"; 
     std::cin >> input; 
     // http://en.cppreference.com/w/cpp/string/byte/isdigit 
     // does not return a bool, you can check that >0 
     if (std::isdigit(input)) { 
      // do what you want. 
      std::cout << "digit\n"; 
      continue; 
     } else { 
      // you can as for more imput like: 
      std::cout << "Not a number, try again?(y/Y):"; 
      std::cin >> try_again; 
      std::tolower(try_again); 
      if (try_again == 'y') { 
       continue; // will start the loop again. 
      } else { 
       break; // it will exit the loop. 
     } 
     } 
    } while(true); 

    return 0; 

    } 
関連する問題