Как правильно расширять размер строки по ходу работы программы? - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д