Не работает запись строк по указателю в цикле
В программе считывается строка и кладется в динамический буфер, пока не будет подан символ \n. Но при работе цикла происходит одно считывание. Очистка stdin не помогает. Как можно исправить программу, чтобы можно было вводить символы в буфер до подачи \n? Компилятор g++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* Input(int *length)
{
int capacity = 200;
int counter = 0;
*length = 0;
char* buffer = (char *) calloc(capacity, sizeof(char));
while( scanf("%200[^\n]%n", buffer + *length, &counter) != 0)
{
fflush(stdin);
*length += counter;
if ( *length > capacity/2 )
{
capacity *= 2;
buffer = (char*) realloc(buffer, capacity * sizeof(char) );
}
}
*(buffer + *length) = '\0';
return buffer;
}
int main()
{
int string_length = 0;
char *str = NULL;
str = Input(&string_length);
printf("String: %s, length: %d\n", str, string_length);
free(str);
return 0;
}
Ответы (1 шт):
Если ты считываешь всё кроме
\n, то в буфере останется этот\n. Надо бы дочитать черезgetchar()илиscanf("%*1[\n]").В описании scanf говорится:
If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof or ferror). And, if either happens before any data could be successfully read, EOF is returned.
В твоём коде получается, что если файл не заканчивается переводом строки, то цикл становится бесконечным. Вероятно, вместо
!=0стоит использовать==2.А вообще, лично я в таких случаях использовал вообще другой подход:
while(counter = 0, scanf("%200[^\n]%n", buffer + *length, &counter), counter)кстати, если тут Си++, то можно
while(scanf("%200[^\n]%n", buffer + *length, &(counter=0)), counter)Думаю, подход с возвращаемым значением формально правильнее, но про этот я точно помню, что он работал.
fflush(stdin)- штука довольно бесполезная.Проверок на нехватку памяти нет, но вряд ли это имеет отношение к вопросу.
Это всё, что я могу сказать не запуская код.