Несколько выпусков:
Прежде всего, вы определили std
как 30-элементный массив из 40-элементных массивов char
; Таким образом, вы можете хранить не более 30 строк не более 39 символов (плюс 0-терминатор), а не 120 строк.
Во-вторых, чтобы прочитать каждую из этих строк, вызов scanf будет просто
for (x = 0; x < 30; x++)
scanf("%s", std[x]);
Типом выражения std[x]
является char [40]
, или массив из 40 элементов char. Однако существует правило, согласно которому при обнаружении выражений типа «N-элемент T» они неявно преобразуются («распад») в тип «указатель на T» (исключения из этого правила возникают, когда выражение массива является операнд sizeof
или унарные &
операторы, или если выражение массива является строковым литералом, используемым для инициализации другого массива в объявлении); таким образом, в этом контексте тип выражения std[x]
распадается на тип char *
или указатель на char, поэтому вам не нужно явно использовать оператор &
.
Риск использования scanf
подобным образом заключается в том, что пользователь может ввести больше символов, чем может вместить целевой буфер; если пользователь вводит 100 символов, эти дополнительные 60 символов будут сохранены в памяти сразу после конца буфера, что может вызвать или не вызвать проблемы в дальнейшем. Вы можете обойти это двумя способами: во-первых, вы можете добавить спецификатор ширины поля в спецификацию преобразования %s
, например:
scanf("%39s", std[x]);
секунду, вы можете полностью не использовать scanf
и использовать fgets
вместо:
fgets(std[x], sizeof std[x], stdin);