Динамическое чтение символов в C с помощью scanf в цикле

Я новичок в C и пытаюсь динамически читать символы. Я хочу сохранить их в массив, чтобы иметь возможность использовать его позже. То, что я получил на данный момент это, и я не понимаю, почему это не работает. Моя проблема в том, что я должен дважды нажать клавишу ввода, и он сохранит только один символ.

char temp;
char tempOld;
int i = 0;
char string[80];

while(scanf("%c", &temp) == 1 && tempOld != '\n')
{
    string[i] = temp;
    tempOld = temp;
    i++;
}

string[i] = '\0';

Суть моего упражнения заключается в том, чтобы не использовать string.h или же scanf("%80s", string)...

Спасибо!

2 ответа

Решение

Ваше состояние петли while(scanf("%c", &temp) == 1 && tempOld != '\n') сначала читает символ, а затем проверяет, был ли предыдущий символ новой строкой. Кроме того, значение tempOld не инициализируется, поэтому поведение на первой итерации цикла фактически не определено.

Вам нужно проверить, была ли текущая прочитанная буква новой строкой, и если да, то завершить цикл. Что-то вроде:

int temp;
while (i < 79 && (temp = getc(stdin)) != EOF && temp != '\n')
{
    string[i++] = temp;
}
string[i] = '\0';

Не вызывайте scanf для чтения ввода с клавиатуры. Этот код предлагает

while(EOF != (temp = getc(stdin)) && tmpOld != '\n')

Кроме того, инициализируйте tmpOld чем-нибудь, иначе компилятор может удалить весь цикл.

Во всяком случае я нашел scanf() быть достаточной болью сзади, что я перестал когда-либо использовать его и только когда-либо используя sscanf() с уже проверенными строками в правильном формате.

Другие вопросы по тегам