Вы не используете никакую другую функцию, которая бы печатала что-либо на экране.
scanf()
- это функция, которая читает и в определенной степени интерпретирует стандартный ввод (обычно пользовательский ввод).
Эквивалентная функция печати printf()
.
Функции scanf()
и printf()
управляются посредством строки форматирования, которая сообщает им, как интерпретировать выводимые данные, или как интерпретировать стандартный ввод, который должен храниться в переменных.
Форматирование строки предоставляется в виде гр строки, которая является нулем строка, которая представляет собой массив символов с последней, являющейся NUL
(\0
лицо; '\0'
символ). В этой строке вы можете предоставить информацию о типе и порядке чтения или записи данных. Fe. %s
обозначает строку. Собственная строка может содержать байты всех значений, кроме NUL
, который считается завершающим символом. Но что касается ввода, пробел считается концом строки, поэтому scanf()
перестанет читать, встречая пробел.
Когда вы читаете данные, вам необходимо предоставить функцию с адресом, и она сохранит там значение. В случае строки, как строки работают в C, вы передаете значение из указателя на символ. Указатель на символ сохраняет значение, являющееся адресом в памяти. Этот адрес может быть одного символа, но он также может быть адресом первого символа в массиве, где последовательные символы хранятся в следующих ячейках памяти. Однако информация о том, сколько памяти, начиная с адреса, хранящегося в этом указателе, выделяется для хранения этого массива символов, не сохраняется автоматически. Фактически, это может быть действительно один символ, который, таким образом, способен хранить не более 0 значащих символов + нулевой завершающий символ, если вы намереваетесь использовать его как строку.
В вашем случае, word[]
является массивом и word
оценивает по позициям word[0]
в памяти. Весь массив содержит 30 символов, поэтому вы можете хранить не более 29 значащих символов + null. Однако scanf()
не гарантирует, что он остановится на 29-м символе, как вы его используете. Возможно, вам следует проконсультироваться на какой-либо справочной странице для scanf()
и узнать больше о форматировании строки, я смутно помню, что, возможно, вы могли бы как-то ограничить чтение с помощью правильной строки форматирования. Может быть, что-то вроде %29s
.
Так что еще раз то, что происходит, ваш обеспечить word
к scanf()
, так что вы предоставить адрес первого символа в массиве word[]
и scanf()
магазинов входа там и в следующих ячейках, возможно переполнение буфера вашего. (Прочитайте о переполнении буфера, пока мы на нем, это важная проблема)
Когда вы печатаете информацию, вам не нужны адреса для хранения, но значения для перевода в человекообразную форму.Однако бывает так, что в случае строк вы по-прежнему указываете адрес первого символа, поэтому он будет выглядеть почти так же.
Проверить возвращаемое значение 'fscanf()' – chux
Попробуйте поместить 'printf ("% s ", word);' before 'fscanf (fp,"% s ", word);' in while-loop. или используйте 'fgets' и' fputs'. Например: 'while (fgets (word, sizeof word, fp)) fputs (word, stdout);' – BLUEPIXY
@BLUEPIXY, который сработал! Большое спасибо за вашу помощь :) – moop