Использование массивов символов
Я хочу использовать 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()
возвращать.