Проблемы c-char scanf

Я не знаю, почему код

scanf("%c",&eingabe);

каждый раз перескакивает.

я пробую это с getchar тоже, но та же проблема снова.

Я использую linux, но выполняю код с помощью xterm.

Кто-нибудь может мне помочь?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int z1,z2,erg=0;
    char eingabe;

    while(1){


    printf("Geben Sie die erste Zahl an: ");
    scanf("%d",&z1); //works
    fflush(stdin); //clear

    printf("nGeben Sie die zweite Zahl an: ");
    scanf("%d",&z2); //works
    fflush(stdin);//clear

    erg=z1*z2; //works
    printf("n%d * %d = %d",z1,z2,erg); //works

    printf("n");
    printf("#######################");
    printf("n");

    printf("Weiter = Wn");
    printf("Stop = Pn");

    printf("Eingabe: ");
    scanf("%c",&eingabe); //this is the line with the problem
    fflush(stdin); //clear

    switch(eingabe){
        case 'w':
        system("clear");
        break;
        case 'p':
        system("exit");
        break;
        default:
        printf("nEingabe Unbekannt");
    }

    printf("n");

    }


    return 0;
}
Метки

3 ответа

  1. Как сказал @codaddict здесь,

    При чтении ввода с помощью scanf вход считывается после нажатия клавиши возврата, но новая строка, генерируемая клавишей возврата, не используется scanf, что означает, что в следующий раз, когда вы будете читать Символ из стандартного ввода, будет готова к чтению новая строка.

    Простое решение состоит в том, чтобы исключить символ новой строки, как это:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int z1,z2,erg=0;
        char buf;
        char eingabe;
    
        while(1){
    
    
        printf("Geben Sie die erste Zahl an: ");
        scanf("%d",&z1); //works
        scanf("%c", &buf);
    
        printf("\nGeben Sie die zweite Zahl an: ");
        scanf("%d",&z2); //works
        scanf("%c", &buf);
    
        erg=z1*z2; //works
        printf("\n%d * %d = %d",z1,z2,erg); //works
    
        printf("\n");
        printf("#######################");
        printf("\n");
    
        printf("Weiter = W\n");
        printf("Stop = P\n");
    
        printf("Eingabe: ");
        scanf("%c",&eingabe); 
    
        switch(eingabe){
            case 'w':
                system("clear");
                break;
            case 'p':
                system("close");
                break;
            default:
                printf("\nEingabe Unbekannt");
        }
    
        printf("\n");
    
        }  
    
    
        return 0;
    }
    

    Или замена ints scanfs чем-то вроде этого: scanf("%d%*c",&n);,

    ИМЕННО ТАКОЙ ОБРАЗ:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int z1,z2,erg=0;
        char buf;
        char eingabe;
    
        while(1){
    
            printf("Geben Sie die erste Zahl an: ");
            scanf("%d%*c",&z1);    //%*c removes the newline from the buffer
    
            printf("\nGeben Sie die zweite Zahl an: ");
            scanf("%d%*c",&z2);    //%*c removes the newline from the buffer
    
            erg=z1*z2; //works
            printf("\n%d * %d = %d",z1,z2,erg); //works
    
            printf("\n");
            printf("#######################");
            printf("\n");
    
            printf("Weiter = W\n");
            printf("Stop = P\n");
    
            printf("Eingabe: ");
            scanf("%c",&eingabe);    //no problem with this.
    
            switch(eingabe){
                case 'w':
                system("clear");
                break;
            case 'p':
                system("close");
                break;
            default:
                printf("\nEingabe Unbekannt");
            }
    
            printf("\n");
    
        }
    
        return 0;
    }
    

    И это мой друг!

    1. как справедливо отметил @UrbiJr, решением было бы исключить ваш символ новой строки. Для того, чтобы сделать это, что вы могли бы также использовать getchar().
      Я запустил ваш код, getchar()и он работает, у меня тоже есть машина Linux, скомпилированная с помощью GCC и запустила двоичный файл в gnome Terminal.
    2. Кроме того, предполагая, что вы хотите выйти из программы при вводе символа ‘p’, вы увереныcase 'p': system("exit");, что работает на вашей машине? Это не сработало для меня, поэтому я использовал case 'p': exit(EXIT_SUCCESS);вместо этого, и это сработало.

      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
         int z1,z2,erg=0;
         char buf;
         char eingabe;
      
         while(1)
         {
          printf("Geben Sie die erste Zahl an: ");
          scanf("%d",&z1); //works
          getchar();
      
          printf("\nGeben Sie die zweite Zahl an: ");
          scanf("%d",&z2); //works
          getchar();
      
          erg=z1*z2; //works
          printf("\n%d * %d = %d",z1,z2,erg); //works
      
          printf("\n");
          printf("#######################");
          printf("\n");
      
         printf("Weiter = W\n");
         printf("Stop = P\n");
      
        printf("Eingabe: ");
        scanf("%c",&eingabe); //works 
      
         switch(eingabe){
         case 'w':
            system("clear");
            break;
         case 'p':
            exit(EXIT_SUCCESS);
            break;
         default:
            printf("\nEingabe Unbekannt");
              }
      
        printf("\n");
      
         }  
              return 0;
         }
      
  2. Это приводит к тому, что ваша программа получит ‘\n’ («Enter» или «newline» от предыдущего ввода) в качестве ввода. Итак, поставьте » getchar ();» перед «scanf(«%c»,&eingabe);».

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int z1,z2,erg=0;
        char eingabe;
    
        while(1){
    
    
        printf("Geben Sie die erste Zahl an: ");
        scanf("%d",&z1); //works
        fflush(stdin); //clear
    
        printf("\nGeben Sie die zweite Zahl an: ");
        scanf("%d",&z2); //works
        fflush(stdin);//clear
    
        erg=z1*z2; //works
        printf("\n%d * %d = %d",z1,z2,erg); //works
    
        printf("\n");
        printf("#######################");
        printf("\n");
    
        printf("Weiter = W\n");
        printf("Stop = P\n");
    
        printf("Eingabe: ");
    
        getchar(); // this is the solution
    
        scanf("%c",&eingabe); //this is the line with the problem
        fflush(stdin); //clear
    
        switch(eingabe){
            case 'w':
            system("clear");
            break;
            case 'p':
            system("exit");
            break;
            default:
            printf("\nEingabe Unbekannt");
        }
    
        printf("\n");
    
        }
    
    
        return 0;
    }