Scanf изменяет ввод в C - PullRequest
       4

Scanf изменяет ввод в C

0 голосов
/ 11 апреля 2020

У меня довольно простая c проблема, но я не могу ее решить.

Я пытаюсь получить информацию от пользователя, подобного этому:

int main() {
    char coord[2];

    fflush(stdin);
    scanf("%c", coord);
}

Когда я пытаюсь этот код с printf("%c", coord);, он отображает совершенно другую строку, чем я набрал. Например, если я наберу «g6», будет напечатано «Ê». Я действительно понятия не имею, почему это происходит.

Спасибо за помощь!

Ответы [ 4 ]

2 голосов
/ 11 апреля 2020

Прежде всего избегайте использования fflush (stdin);. Стандартное мигание ввода является неопределенным поведением, согласно стандарту C, и может привести к большим проблемам.

Затем вы пытаетесь получить строку ввода в формате %c, который должен получить один персонаж. Кроме того, в вашем массиве coord недостаточно места для символа окончания строки (\0).

Формат, используемый для получения строки с scanf ( и распечатать его с помощью printf): %s:

int main() {
    char coord[3] = {0};

    scanf("%2s", coord);

    printf ("%s\n", coord);
}

«2», добавленный в формат, обеспечивает чтение не более двух символов (именно тех, которые вы можете иметь в строковом массиве без перезаписи последнего символа).

2 голосов
/ 11 апреля 2020

Если вы хотите получить строку (массив символов) от пользователя, вы должны сделать это:

scanf("%s",coord);

% c для одного символа

1 голос
/ 11 апреля 2020

Строка char coord[2]; объявляет coord как массив символов (также известный как "строка"). Однако %c (как в scanf, так и в printf) читает / записывает символ single .

Для строк необходимо использовать формат %s.

Кроме того, если вы хотите сохранить / прочитать / распечатать строку, "g6", вам необходимо выделить (как минимум) три символа для вашего массива coord, так как вы must завершить все строки C символом nul .

Кроме того, вызов fflush в потоке stdin не эффективен (на самом деле это вызывает неопределенное поведение , поэтому все может произойти) - см. здесь: Я не могу грипп sh stdin .

Итак, "быстрое решение" для ваш код будет выглядеть примерно так:

#include <stdio.h>
int main()
{
    char coord[3]; // Allow space for nul-terminator
//    fflush(stdin); // don't do it
    scanf("%2s", coord); // The "2" limits input to 2 characters
    printf("%s\n", coord);
    return 0; // ALways good practice to return zero (success) from main
}
1 голос
/ 11 апреля 2020

Для начала это утверждение

fflush(stdin);

имеет неопределенное поведение и должно быть удалено.

Спецификатор преобразования %c printf ожидает аргумент типа char во время передачи Выражение типа char *, в которое неявно преобразуется указатель массива

printf("%c", coord);

, необходимо записать либо

printf("%c", *coord);

, либо

printf("%c", coord[0]);

Обратите внимание на что с помощью этого вызова scanf

scanf("%c", coord);

вы можете ввести только один символ. Вы не можете ввести строку.

Если вы хотите ввести строку в координате массива, которая имеет только два элемента, то вам нужно написать

scanf( "%1s", coord);

В этом случае массив будет заполнена строкой длиной, равной 1.

В этом случае вы можете вывести ее как

printf("%s", coord);

Если вы хотите ввести строку, подобную этой "g6", вам нужно объявить массив как

char coord[3];

и напишите следующий вызов scanf

scanf( "%2s", coord);
...