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