В C, почему мне иногда нужен только getchar () для удаления символов? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь использовать getchar() для удаления символов из буфера ввода.В следующем коде пользователю предлагается ввести выбор для выбора, а затем, в зависимости от выбора, требуется другой ввод, либо введите int или введите char (строка).

Вint case, getcar() не требуется и scanf правильно вводит данные.Но в случае char, scanf не может получить ввод без предварительного использования getchar().Есть ли причина, почему это так?

printf("Available Ciphers:\n1) Caesar Cipher\n2) Vigenere Cipher\nSelected Cipher: ");
if(scanf("%d", &choice) != 1){
    printf("Error: Bad selection!\n");
    exit(EXIT_SUCCESS);
} else if (choice != 1 && choice != 2){
    printf("Error: Bad Selection!\n");
    exit(EXIT_SUCCESS);
//If the choice entered is correct, then run the following.
} else {
    if(choice == 1){
        printf("Input key as nuumber: ");
        if(scanf("%d", &caesarkey) != 1){ //Why is getchar() not needed here?
            printf("Error: Bad Key!\n");
            exit(EXIT_SUCCESS);
        }
        //morecode here
    } else if (choice == 2){
        printf("Input key as string: ");
        while(getchar() != '\n');  //Why is this needed here?
        /*Uses scanf and not fgets, since we do not want the
        key to contain the newline character '\n'. This is
        due to the fact that the newline character is not
        considered in the function that encrypts and decrypts
        plaintext and ciphertext.*/
        if(scanf("%[^\n]s", vigencipherkey) != 1){
            printf("Error, Cannot read inputted key!\n");
            exit(EXIT_SUCCESS);
        }
        //More code here..
    }
}

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Похоже, что вы сканируете строку, а не int, и поэтому вы передаете int, а не адрес int.

Измените эту строку

   if(scanf("%[^\n]s", vigencipherkey) != 1){

К

  if (scanf("%d", &vigencipherkey) != 1) {
0 голосов
/ 30 марта 2019

Чтобы прочитать остаток строки, введенной пользователем, вы можете использовать эту функцию:

int flush_line(void) {
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        continue;
    return c;
}

Примечания:

  • c должно быть определено какint для учета всех значений типа unsigned char и специального отрицательного значения EOF.
  • , вы должны проверить на '\n' и EOF, иначе у вас будетбесконечный цикл на преждевременном конце файла без завершающего символа новой строки, например, если вы перенаправляете ввод вашей программы из пустого файла.
  • вы можете проверить конец файла, сравнив возвращаемое значение flush_line() с EOF.
...