Бьюсь об заклад, ваш вызов scanf находится внутри цикла.Могу поспорить, это работает, когда вы в первый раз звоните.Могу поспорить, что он провалится только во второй и более поздние времена.
В первый раз он будет читать, пока не достигнет символа новой строки.Символ новой строки останется непрочитанным.(Скорее всего, внутренняя библиотека действительно читает ее и вызывает ungetc, чтобы ее не прочитать, но это не имеет значения, потому что с точки зрения вашей программы новая строка не читается.)
Во второй раз она прочитаетпока он не достигнет символа новой строки.Этот символ новой строки все еще ожидает в начале строки, и scanf прочитает все 0 символов, ожидающих его впереди.
В третий раз ... то же самое.
Вывероятно, это нужно:
if (scanf("%99[^\n]%*c", buffer) == 1) {
Редактировать: я случайно скопировал и вставил другой ответ вместо вопроса, прежде чем вставить% * c, как предполагалось.Эта результирующая строка кода будет вести себя странно, если строка ввода длиннее 100 байт, потому что% * c будет есть обычный байт вместо новой строки.
Однако обратите внимание, насколько опасно этосделайте это:
scanf("%[^n]%*c", string1);
потому что там, если у вас строка ввода длиннее буфера, ввод будет проходить по всем вашим другим переменным, стеку и всему прочему.Это называется переполнением буфера (даже если переполнение идет в стек).