2012-03-26 1 views
1

関数検証では、 "foodSelect"の3番目のループと同じ "size"というループがありますが、それは何らかの理由で異なった動作をします。それは入力のために私のためのプロンプトを出しません、それはそれの内部に直接行くとWhat size (L - Large, M - Medium, S - Small): Please enter S, M, or L only:を尋ねます。最初にエラーが表示され、もう一度入力を求められます。それは奇妙だ。私のループ内の文がCでスキップされている場合

ソース(それは長いだから):http://pastebin.com/raw.php?i=KxrMAXaU

かここにソース:

#include <stdio.h> 
#include <string.h> 

void menu(); 
void question (char choice[]); 
void output(char *foodChoice, char *foodSelect, char *foodSize, int *foodOrderNum, float *foodSubtotal); 
int verify(char *choice, char *foodChoice); 

void menu() { 
/* 
printf("\n"); 
*/ 
    printf("\nWelcome to Sunny FISH & CHIPS!\n\n"); 
    printf("########  Fish :  Haddock(K) Large(L) | $5.00\n"); 
    printf("# FOOD #    Halibut(T) Large(L) | $4.00\n"); 
    printf("########  Chips:  Cut(C)  Large(L) | $2.00\n"); 
    printf("      Ring(R) Large(L) | $3.00\n"); 
    printf("           | \n"); 
    printf("########## Soft Drinks(S)  Large(L) | $2.00\n"); 
    printf("# DRINKS # Coffee(C)    Large(L) | $1.75\n"); 
    printf("########## Tea(T)    Large(L) | $1.50\n"); 
    printf("---------------------------------------------\n"); 
    printf("Note: Medium price: 80%% of large.\n"); 
    printf("  Small price: 60%% of large.\n"); 
    printf("TAX is 10%%.\n"); 
    printf("More than 5 fish, 10%% discount on drink.\n"); 
    printf("Every 10 fish purchased, get 1 free softdrink.\n"); 
    printf(" - size of drink is according to size of fish\n"); 
    printf("----------------------------------------------\n\n"); 
} 

int verify(char *choice, char *foodChoice) 
{ 
    int answer, rc = -1; 
    if (choice == "order") 
    { 
     do { 
      answer = getchar(); 
      if (answer == 'Y' || answer == 'y') 
      { rc = 1; } 
      else if (answer == 'N' || answer == 'n') 
      { rc = 0; } 
      if (rc == -1 && answer != -1) 
      { 
       printf("Please enter y or n only: "); 
       while (answer != -1 && answer != '\n') 
       answer = getchar(); 
      } 
     } while (rc == -1 && answer != -1); 
    } 
    if (choice == "foodSelect") 
    { 
     do { 
      answer = getchar(); 

       if (foodChoice == "Fish") 
       { 
        do { 
         answer = getchar(); 
         if (answer == 'K' || answer == 'k') 
         { rc = 1; } 
         else if (answer == 'T' || answer == 't') 
         { rc = 0; } 
         if (rc == -1 && answer != -1) 
         { 
          printf("Please enter K or T only: "); 
          while (answer != -1 && answer != '\n') 
          answer = getchar(); 
         } 
        } while (rc == -1 && answer != -1); 
       } 
       if (foodChoice == "Chips") 
       { 
        do { 
         answer = getchar(); 
         if (answer == 'C' || answer == 'c') 
         { rc = 1; } 
         else if (answer == 'R' || answer == 'r') 
         { rc = 0; } 
         if (rc == -1 && answer != -1) 
         { 
          printf("Please enter C or R only: "); 
          while (answer != -1 && answer != '\n') 
          answer = getchar(); 
         } 
        } while (rc == -1 && answer != -1); 
       } 
       if (foodChoice == "Drinks") 
       { 
        do { 
         answer = getchar(); 
         if (answer == 'S' || answer == 's') 
         { rc = 1; } 
         else if (answer == 'C' || answer == 'c') 
         { rc = 2; } 
         else if (answer == 'T' || answer == 'T') 
         { rc = 3; } 
         if (rc == -1 && answer != -1) 
         { 
          printf("Please enter S, C, or T only: "); 
          while (answer != -1 && answer != '\n') 
          answer = getchar(); 
         } 
        } while (rc == -1 && answer != -1); 
       } 
     } while (rc == -1 && answer != -1); 
    } 
    if (choice == "size") 
    { 
     do { 
      answer = getchar(); 
      if (answer == 'S' || answer == 's') 
      { rc = 1; } 
      else if (answer == 'M' || answer == 'm') 
      { rc = 2; } 
      else if (answer == 'L' || answer == 'l') 
      { rc = 3; } 
      if (rc == -1 && answer != -1) 
      { 
       printf("Please enter S, M, or L only: "); 
       while (answer != -1 && answer != '\n') 
       answer = getchar(); 
      } 
     } while (rc == -1 && answer != -1); 
    } 
} 

void question (char *choice) { 

    char *choiceYesNo; 
    char *foodOptions; 
    char *foodChoice; 
    char *foodSelect; 
    char *foodSize; 
    int *foodOrderNum; 
    float *foodSubtotal; 

    switch (choice[0]) { 
     case 'f': 
      foodChoice = "Fish"; 
      foodOptions = "(K- Haddock, T- Halibut)"; 
      break; 
     case 'c': 
      foodChoice = "Chips"; 
      foodOptions = "(C- Cut, R- Ring)"; 
      break; 
     case 'd': 
      foodChoice = "Drinks"; 
      foodOptions = "(S- Softdrink, C- Coffee, T- Tea)"; 
      break; 
    } 

    printf("\nDo you order %s? (Y/N): ", foodChoice); 
     verify("order", foodChoice); 
    printf("%s choice %s: ", foodChoice, foodOptions); 
     verify("foodSelect", foodChoice); 
    printf("What size (L - Large, M - Medium, S - Small): "); 
     verify("size", foodChoice); 
    printf("How many orders do you want? (>=0): "); 
     scanf("%d", &foodOrderNum); 
    output(foodChoice, foodSelect, foodSize, foodOrderNum, foodSubtotal); 
} 

void output(char *foodChoice, char *foodSelect, char *foodSize, int *foodOrderNum, float *foodSubtotal) { 

    printf("\nYou ordered %s: %c - SIZE: %c amount ordered: %d, subtotal price: %.2lf\n\n", 
    foodChoice, foodSelect, foodSize, foodOrderNum, foodSubtotal); 

} 



int main() { 

    //menu(); 

    question("drinks"); 


} 
+2

Cは '' ==を使用して文字列の直接比較をサポートしていません。代わりに['strcmp'](http://linux.die.net/man/3/strcmp)を使用してください。以下も参照してください:http://stackoverflow.com/questions/6715247/what-is-the-difference-between-some-some-0-and-strcmpsome-ome-0-in –

+3

あなたは最小限のテストケース?そのコードはかなり長いです。 –

+0

ヒント:C言語の文字列を比較するのに==を使うことはできません – antlersoft

答えて

1

別にあなたは本当に(あなたが唯一の文字列リテラルを使用しているので、この場合には、残念ながら仕事しそうではありませんが)==で文字列を比較するべきではないという事実から、あなたの悩みは選択肢のニーズのためのエントリですreturnキーを押します。したがって、入力バッファから選択肢の文字を1つ取得すると、その中にまだ改行が残っています。

printf("answer = %d\n",answer); 

最初のループの後にanswer = getchar();を配置します。それはあなたに改行'\n'(10)[または多分キャリッジリターン'\r'(13)を得ましたが、以下の理由から、入力バッファから]そうでないと信じています。 foodSelectループでは、if文の前にanswer = getchar();があり、do-whileループの先頭にすぐに1つあります。これにより、入力バッファがクリアされます。しかし、foodSize支店ではあなたが持っていません。各選択肢の後

、入力バッファをクリアし

while((answer = getchar()) != -1 && answer != '\n); 
+0

ありがとうございました。ありがとうございました。私の仕事の前に 'answer = getchar()'を置くことを提案しました。 – eveo

4

私は対話型プログラムのためのgetchar()の使用はお勧めしません。あなたが入力したすべてのものの後に来る改行文字を扱うようには見えません。代わりにfgets()を使用してください。あなたがを入力しYのようなものを押したときに

は、上記を明確にするには、標準入力に文字を入力しました。 getchar()の最初の呼び出しは 'Y'を返し、次の呼び出しは '\n'(改行文字)を返します。あなたのコードでは改行文字が続くとは予想されず、入力した文字が実際に返ってきたときには getchar()への呼び出しをスキップするように見えるかもしれません。

fgets()を使用すると、ユーザが入力した改行を含めて行全体が一斉にになります。あなたは(通常)入力バッファーで待っている余分なデータについて心配する必要はありません。

+0

fgetsを使用することはできませんgetchar。(choice == "size")が問題ではない、うまくいきますが、実際には 'foodSelect'の3番目のループと実質的に同じときは何の理由もありません。 – eveo

+0

'fgets()'を使用しようとするとエラーが発生しますか? ''にあり、 'getchar()'と同じですので問題ありません。 –

+0

fgetsを使用できないあなたは '\ n'を直接読んでください。 n scanf – vascop

2

文字列を==と比較することはできません。文字列は本質的に(文字の配列への)ポインタなので、ポインタ(文字が格納されているメモリ内の実際のアドレス)を比較しています。文字列ごとに文字列を比較するには、適切な関数を使用する必要があります。デフォルトの選択はstrcmpです。

また、Greg Hewgillが述べたように、getcharを使用すると、質問に記載されているスキップ動作が発生します。その理由は、ユーザーがgetchar()からコードに制御を戻すために、enter(これはコンソール入力の仕組み)を押す必要があるためです。キーenterは、読み取られた文字の1つ(つまり、ユーザーが「y」を入力した場合は2番目の文字)になるため、getcharenterキーのコードを返したときに文字の比較も失敗します。

+0

文字列は定数として代入され、定数と比較され、OPのコンパイラが定数の文字列の折り畳みを行う場合(実際のように見える)、 '=='が実際に動作します。 –

+0

コンパイラに依存しているかもしれませんが、OPはその動作に依存してはいけません。 – Attila

関連する問題