0

単純なスイッチ条件を含むプログラムを作成しています。

私が遭遇した問題は、ユーザーが文字を入力してプログラムを中断できないように、ユーザー入力も検証していることです。

削除するとスイッチは正常に機能するisdigit()ので、データ検証で何かが起こっていることがわかります。

私がするように言われたことは私の中で使用することでした、しかし%cscanf()がそれをするならば、それから何か他のものがプログラムが機能するのを妨げます。ケースが1、2、3 ...であるため、スイッチが参照されなくなったためだと思われます。

私がやりたい方法は、スイッチに到達する前に文字を整数に戻すことですが、どうすればそれができるかわかりません。

プログラムの一部をコピーして貼り付けると何かが起こっているので、プログラム全体を貼り付けます。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
   int BusRoute, LTrigger;
   char StartLoc,DestLoc;

   LTrigger = 1;
   BusRoute = 0;
   StartLoc = 0;
   DestLoc = 0;

   while (LTrigger >= 1)
   {
//Give user a menu and prompt to select input for BusRoute
   printf("\n\n\tPlease only use the numbers provided.");
   printf("\n\n  1.\n\tRoute_1\tCherokee Park and KFC YUM Center transit.");
   printf("\n\n  2.\n\tRoute_2\tUL and Cherokee Park transit.");
   printf("\n\n  3.\n\tRoute_3\tUL and KFC YUM Center transit.");
   printf("\n\n\n\t Please select one route from the above menu.");
   printf(" \n\n\tOnly use the single digit corresponding to the route: ");
   scanf("%d" , &BusRoute);

//Refresh window      
   system("cls");    

   if(isdigit(BusRoute))
   {
//Use switch to determin user's Route. Then present choice of To/From          
  switch (BusRoute)
             {         
        case 1:
        printf("\n\n\tYou have chosen Cherokee Park and KFC YUM Center transit.");
        printf("\n\n\tIf you want to travel from Cherokee Park to KFC YUM Center enter C.");
        printf("\n\n\tIf you want to travel from KFC YUM Center to Cherokee Park enter K.");
        printf("\n\n\tEnter your seletion now: ");
        scanf("%c" , &StartLoc);                                                           
        break;

//give two if statements to determine users location and confirm destination
        if (StartLoc == 'c' || StartLoc == 'C')
        {
        printf("\n\n\tYou have chosen to travel from Cherokee Park to KFC YUM Center.");
        printf("\n\n\tTo confirm you want to travel from Cherokee Park to KFC YUM Center please enter K: ");
        scanf("%c" , DestLoc);
//refresh           
        system("cls");  

 //confirmation of destination
         if (DestLoc == 'k' || DestLoc == 'K')
          {
               printf("\n\n\tYour bus route will pick you up from Cherokee Park and take you to KFC YUM Center.");
               getch();
           }//end dest                                                    
          }//end start

          //false user input           
             else
             {
               printf("\n\n\tYou did not enter a correct character.\n\n\tPress enter and only enter specific values.");
               getch();

                   //reset loop and refresh
               LTrigger = 1;
               system("cls");
               }//end else


          case 2:
          printf("\n\n\tYou have chosen Cherokee Park and UL transit.");
          break;

          case 3:
          printf("\n\n\tYou have chosen UL and KFC YUM Center transit.");
          break;

             }//end switch
      }//end if
               else
               {
                   printf("\n\n\tYou did not enter a number.\n\n\tPress enter and only enter specific values.");
                   getch();

                   //reset loop and refresh
                   LTrigger = 1;
                   system("cls");
                }//end else
      }//end loop

      getch();

 }//end main
4

3 に答える 3

3

isdigit'0'は文字を取り、それがとの間の文字であるかどうかを言い'9'ます。ただし、文字ではなく整数を渡すため、その出力は無意味です。

成功したかどうかを知りたい場合はscanf、戻り値を確認してください。成功した場合は 1 になり、失敗した場合は 0 になります (実際には、割り当てられた変数の数が返されます)。

if (scanf("%d", &BusRoute) > 0)
{

が 1 桁かどうかを知りたい場合BusRouteは、単純に 0 から 9 (または 3) の間であることを確認できますが、その必要はありません。代わりにdefault:switch.

ところで、あなたは&行を逃しました

scanf("%c" , DestLoc);

そのはず:

scanf("%c" , &DestLoc);

%cまた、バッファ内に残っているスペースやキャリッジ リターン (たとえば、前のユーザー操作など) を使い果たす前に、スペースを追加することをお勧めします。

scanf(" %c" , &DestLoc);

同上、そのStartLoc場合。

于 2012-09-11T23:00:31.657 に答える
1

コードを見ずにこれに答えるのは難しいです。型キャストを使用して、文字を整数に変換できます。

switch((int) variable)

がユーザーによって入力された文字である場合variable、型キャスト(int)はそれを の ASCII コードに変換しswitchます。ただし、通常、C では文字を整数として解釈するために型キャストは必要ありません。

于 2012-09-11T22:58:06.220 に答える
0

これを見てください:

char charBusRoute;
int BusRoute;

/* ... */

scanf("%c",&charBusRoute);

if(isdigit(charBusRoute)){
    BusRoute = charBusRoute - '0';
    /* ... */
}
于 2012-09-11T23:00:21.103 に答える