2015-03-08 2 views
0

Я хочу использовать 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]); 
} 

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

+1

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

+0

Попробуйте выполнить промывку вашего выхода после второго цикла с помощью 'fflush (stdout)' – Cyclonecode

+1

Очевидно, у вас есть Typo, и ваши символы не печатаются, потому что выходной буфер не сбрасывается '% c/n' ->'% c \ n' , Также 'Спасибо \ n' было бы лучше, так как он напечатал бы первый символ в следующей строке и не использовал бы' getch() 'это не стандартное использование' getchar() ', а также' scanf_s() '- > 'scanf()' learn standard c, чтобы вы могли кодировать любую платформу. И как я сказал вам, что вы делаете это раньше, 'scanf ("% c ", & arr [index]);' должен делать это без '_getch()' вещи. –

ответ

1

Изменить

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

Для

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

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

Кроме того, printf в цепи имеет /n вместо \n для новой строки.

+0

Да, я не рассматривал критерии «количества символов». Это должно сделать это. Благодарю. – Ricky

+0

Таким образом, очевидно я попробовал ваш Scanf заявление :: для (индекс = 0; индекс <размер, индекс ++) \t { \t \t scanf_s ("% с", и обр [индекс], 1); \t} \t printf ("\ nThanks"); \t fflush (stdout); \t для (индекс = 0; индекс <размер; ++ индекс) \t { \t \t Е ("% с \ п", обр [индекс]); \t} И это сработало. Благодарю. – Ricky

1

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

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().
+0

Теперь я знаю, я не думал, что решение по-другому. Спасибо, что устраняет проблему – Ricky

Смежные вопросы