Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Функция посимвольного считывания ввода


Автор: trinitr0 30.6.2020, 10:25
Помогите пожалуйста в реализации функции, которая считывает посимвольно ввод, до тех пор пока не достигнет конца ввода или не встретится символ переноса строки. Функция должна возвращать C-style строку с прочитанными символами.

Пытался так:

Код

char* getline()
{
    char in;
    int i=0;
    
    char* pOld = new char[1]; 
    char* pNew = new char[1];  

    while(cin.get(in) && (in != '\n'))
    {
          i++;
          pOld[i]=in;
    }  
     
    pOld = pNew; 
    delete [] pNew;
    pOld[i] = '\0'; 
    
    return pOld; 
}
} 


Но это вызывает segmentation fault в тестирующей системе.

Автор: Romikgy 30.6.2020, 10:34
Цитата(trinitr0 @  30.6.2020,  09:25 Найти цитируемый пост)
char* old = new char[1]; 

Цитата(trinitr0 @  30.6.2020,  09:25 Найти цитируемый пост)
old[i]=in;

вы выделили чаров на 1 символ... а пихаете туда на всю строку!

Цитата(trinitr0 @  30.6.2020,  09:25 Найти цитируемый пост)
 char* new = new char[1];  

new это служебное слово , его нельзя использовать



Автор: trinitr0 30.6.2020, 10:37
"new это служебное слово , его нельзя использовать" - да я глупость написал, исправил.

А почему всю строку, ведь in тип char имеет?

Автор: Romikgy 30.6.2020, 13:24
Цитата(trinitr0 @  30.6.2020,  09:37 Найти цитируемый пост)
А почему всю строку, ведь in тип char имеет?


Цитата(trinitr0 @  30.6.2020,  09:25 Найти цитируемый пост)
pOld[i]=in;

i у вас будет увеличиваться ? куда будет ссылаться массив pOld при индексе более нуля ????

Автор: trinitr0 30.6.2020, 15:17
Кое-как со сторонней помощью и собственных усилий решил так:

Код

char *getline()
{
    char in;
    int i=0;
    char* pOld = new char[1];  
    
    while(cin.get(in) && (in != '\n')){ 
        ++i;
        pOld[i-1] = in;
        char* pNew = new char[i+1]; 
        
        for (int j=0;j<i;++j){ 
                pNew[j] = pOld[j];
        }   

        delete [] pOld;
        pOld = pNew;
    }
 
pOld[i] = '\0';
return pOld; 
}


Комментарии и замечания приветствуются!

Автор: Romikgy 30.6.2020, 17:48
Код

char *getline()
{
char* pOld = new char[1024];  
cin.getline(pOld ,1023,'\n') ;
return pOld; 
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)