Как правильно расширять размер строки по ходу работы программы? - C (СИ)
Формулировка задачи:
Как сделать динамическую строку ( string в С++ )?
Пробовал вот так:
Но тут есть проблема: не работает кнопка Backspace, т.е если пользователь захочет удалить неправильно введённый символ, то вместо того, чтобы его удалить в консоле появится иероглиф.
Как правильно расширять размер строки по ходу работы программы?
char ch;
int k = 0;
do
{
ch = getch( );
k++;
}
while( ch != 13 ); // 13 - код клавиши Enter
char *str = malloc( (k+1)*sizeof( char ) );Решение задачи: «Как правильно расширять размер строки по ходу работы программы?»
textual
Листинг программы
char ch, *s;
int k = 0;
s=calloc(1,1);
do
{
ch = getch( );
if(!ch) getch();
else
if(ch==8 && k)
{
putch(8); putch(32); putch(8);
k--;
s=realloc(s,k+1);
*(s+k)=0;
}
else
if(ch!=8 && ch!=9 && ch!=13)
{
putch(ch);
k++;
s=realloc(s,k+1);
*(s+k-1)=ch;
*(s+k)=0;
}
}while( ch != 13 );
printf("\n%s\n",s);
Объяснение кода листинга программы
В этом коде используется динамическое выделение памяти для строки с помощью функций calloc и realloc.
char ch, *s;- объявление двух переменных:chтипаcharиsтипаchar*(указатель наchar).int k = 0;- объявление переменнойkтипаintи инициализация её значением 0.s=calloc(1,1);- выделение памяти под строку длиной 1 символ с помощью функцииcalloc.do- начало цикла.ch = getch( );- получение ввода с клавиатуры с помощью функцииgetch.if(!ch) getch();- проверка, был ли получен символ, и если нет, то повторный вызовgetch.else- начало блока условий для обработка символов.if(ch==8 && k)- проверка, является ли текущий символ символом Backspace (8) и есть ли в строке символы.putch(8);- вывод символа Backspace.putch(32);- вывод пробела.putch(8);- вывод символа Backspace.k--;- уменьшение значения переменнойkна 1.s=realloc(s,k+1);- изменение размера строки с помощью функцииrealloc.*(s+k)=0;- обнуление последнего символа строки.else- начало блока условий для обработка других символов.if(ch!=8 && ch!=9 && ch!=13)- проверка, не является ли текущий символ символом Backspace (8), Tab (9) или Enter (13).putch(ch);- вывод текущего символа.k++;- увеличение значения переменнойkна 1.s=realloc(s,k+1);- изменение размера строки с помощью функцииrealloc.*(s+k-1)=ch;- запись текущего символа в позициюk-1в строке.*(s+k)=0;- обнуление последнего символа строки.}while( ch != 13 );- продолжение цикла до тех пор, пока не будет введен символ Enter (13).printf(\n%s\n,s);- вывод строкиsс помощью функцииprintf.