У вас есть пара проблем, и я сохраню большую до последнего.
Во-первых, возможно, что ваш бесконечный цикл является результатом того, как вы используете getchar
.
getchar
возвращает значение символа, считанного из стандартного ввода. Он возвращает EOF (зависящее от платформы значение, но обычно -1) в случае ошибки или конца файла. Однако конец файла (возможно, в зависимости от вашей платформы) действительно происходит только в том случае, если вы перенаправили файл в stdin при вызове программы, т.е. если есть файл, который может завершиться.
CTRL-Z на некоторых платформах может интерпретироваться как конец файла, как и CTRL-D, но это, конечно, не универсально, и я не уверен ни в одной из них.
Если CTRL-Z не интерпретируется как конец файла, это может привести к двум возможным результатам. Одним из них является принудительное прерывание вашей программы, немного похожее на CTRL-Break в командной строке Windows. Другое - CTRL-Z обрабатывается как нажатие клавиши так же, как и любое другое, что, вероятно, приводит к тому, что код символа 26 возвращается из getchar
.
Далее, я не думаю, что вам вообще нужен fseek, так как ваш режим открытия - "+", хотя он и для меня не выглядит неправильно - но я недостаточно использую C, чтобы быть уверенным в этом.
Наконец - я также думаю, что у вас есть серьезная проблема в том, как вы используете scanf, которая вызывает серьезное неопределенное поведение. Возьмите следующую строку ...
scanf("%s",word);
Ваша переменная word
определяется следующим образом ...
char c,*word,*sent,fname[20];
ОК, это указатель на символ, но этот указатель не инициализирован. Вам нужен буфер памяти для хранения входного текста, и вам нужно инициализировать указатель. Обычно проще объявить word
как массив символов, например ...
char word [100];
Это гарантирует наличие некоторой памяти, доступной для хранения результирующей строки, но не гарантирует, что буфер памяти достаточно большой. Этот момент является серьезным для программирования в реальном мире, но, вероятно, это не то, о чем вы должны беспокоиться в данный момент.
Странно, что вы, похоже, уже решили эту проблему для fname
. Это говорит о том, что вы можете автоматически применять предложения пользователей для исправления кода, не понимая проблем, что немного беспокоит. Поэтому я дам вам предупреждение - кажется, вы не используете sent
в данный момент, но если он предназначен для использования так же, как word
и fname
, у него будет та же проблема что word
имеет.