Вы делаете вещи в неправильном порядке в вашем коде: то, как ваш код структурируется, чтение и сохранение первого символа перемещается из цикла.В цикле этот символ затем перезаписывается.В этом случае начните с i = 1
.
Возможно, вы все равно хотите прочитать первый символ, но я думаю, что вы хотите прочитать все до первого пробела, который может быть первым символом.Затем сделайте следующее:
#include <stdio.h>
int main(void)
{
char input[80];
int i = 0;
int c = getchar();
while (c != ' ' && c != '\n' && c != EOF) {
if (i + 1 < sizeof(input)) { // store char if the is room
input[i++] = c;
}
c = getchar();
}
input[i] = '\0'; // null-terminate input
puts(input);
return 0;
}
На заметку:
Первый символ читается перед циклом.условие цикла и код, который хранит символ, затем используют этот символ.Непосредственно перед концом тела цикла читается следующий символ, который затем будет обработан в следующей итерации.
Вы не навязываете, что буфер символов input
не можетбыть перезаписанЭто опасно, особенно потому, что ваш буфер крошечный.
Когда вы строите строки char по char, вы должны завершить его нулем, поместив в конце явный '\0'
.Вы должны убедиться, что есть место для этого терминатора.Почти все системные функции, такие как puts
или printf("%s", ...)
, ожидают, что строка будет заканчиваться нулем.
Получите результат getchar
и int
, чтобы вы могли различатьмежду всеми действительными кодами символов и специальным значением EOF
.
Приведенный выше код полезен, если первый и последующие вызовы для получения следующего элемента отличаются, например, при токенизации строкис strtok
.Здесь вы также можете выбрать другой подход:
while (1) { // "infinite loop"
int c = getchar(); // read a char first thing in a loop
if (c == ' ' || c == '\n' || c == EOF) break;
// explicit break when done
if (i + 1 < sizeof(input)) {
input[i++] = c;
}
}
Этот подход имеет логику обработки символов только в теле цикла, но вы должны заключить его в бесконечный цикл, а затем использовать явный break
.