Использование массивов символов

Я хочу использовать scanf_s("%c\n", &arr[index]) вводить один символ за раз в одну строку, используя for/while петля. Я не могу понять, как вывести результат. Ниже приведен код.(Я только хочу использовать scanf заявление. fgets путь прост.

printf("\nEnter the lowercase letters\n");
for (index = 0; index < size; index++)
{
    scanf_s("%c\n", &arr[index]);
    _getch();
}
printf("\nThanks"); 
for (index = 0; index < size; ++index)
{
    printf("%c/n", arr[index]);
}

Он принимает входные данные, но выходит после выражения благодарности. Я не могу понять, почему. Хотя я использовал другой метод, который работает. Это просто вариант, который я пытался.

2 ответа

Решение

+ Изменить

scanf_s("%c\n", &arr[index]);
_getch();

к

scanf_s(" %c", &arr[index], 1);

При сканировании символа (%c) или строка (%s) с помощью scanf_sнеобходимо указать дополнительное значение в качестве параметра, который указывает количество сканируемых символов.
Пространство перед %c отбрасывает все пробельные символы (новые строки, пробелы и т. д.), включая ни один, перед сканированием непробельного символа.

Так же printf в цикле есть /n вместо \n для новой строки.

Этот код, вероятно, будет работать лучше:

int nchars;

printf("\nEnter the lowercase letters\n");
for (index = 0; index < size; index++)
{
    if (scanf_s("%c", &arr[index], 1) != 1)
        break;
}
printf("\nThanks\n");
nchars = index;  // Do not report on values that were not entered 
for (index = 0; index < nchars; ++index)
{
    printf("%c\n", arr[index]);
}

Обратите внимание, что при использовании scanf_s() и %c формат (и %s а также %[…]форматов), требуется длина, а также указатель на место хранения данных (два аргумента для одной спецификации преобразования). Это сообщает функции, сколько места доступно для хранения значения. Часто длина не будет 1; вы бы использовали scanf_s("%s", buffer, sizeof(buffer)) читать строку.

Это хорошая идея, чтобы проверить возвращаемое значение из scanf_s() каждый раз, когда вы используете его, чтобы вы знали, работает ли он или нет.

Вы можете добавить дополнительные критерии для разрыва цикла, например, если код читает новую строку.


Я также отметил некоторые проблемы в комментариях - проблемы исправлены в коде выше.

  • Почему вы используете _getch() когда вы также сканируете с scanf_s()? Это сбивает с толку бедного пользователя, который печатает abcd и видит только ac, _getch() ест b а также d,
  • Кроме того, новая строка \n не /n - третий printf() имеет это как опечатку.
  • С помощью \n в конце строки формата интерактивного ввода плохая идея; пользователь должен ввести что-то, что не является символом пробела после ввода, чтобы получить scanf_s() возвращать.
Другие вопросы по тегам