Как правильно расширять размер строки по ходу работы программы? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Как сделать динамическую строку ( string в С++ )? Пробовал вот так:
char ch;
int k = 0;
 
do
 {
    ch = getch( );
    k++;
 }
while( ch != 13 ); // 13 - код клавиши Enter
 
char *str = malloc( (k+1)*sizeof( char ) );
Но тут есть проблема: не работает кнопка Backspace, т.е если пользователь захочет удалить неправильно введённый символ, то вместо того, чтобы его удалить в консоле появится иероглиф. Как правильно расширять размер строки по ходу работы программы?

Решение задачи: «Как правильно расширять размер строки по ходу работы программы?»

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.

  1. char ch, *s; - объявление двух переменных: ch типа char и s типа char* (указатель на char).
  2. int k = 0; - объявление переменной k типа int и инициализация её значением 0.
  3. s=calloc(1,1); - выделение памяти под строку длиной 1 символ с помощью функции calloc.
  4. do - начало цикла.
  5. ch = getch( ); - получение ввода с клавиатуры с помощью функции getch.
  6. if(!ch) getch(); - проверка, был ли получен символ, и если нет, то повторный вызов getch.
  7. else - начало блока условий для обработка символов.
  8. if(ch==8 && k) - проверка, является ли текущий символ символом Backspace (8) и есть ли в строке символы.
  9. putch(8); - вывод символа Backspace.
  10. putch(32); - вывод пробела.
  11. putch(8); - вывод символа Backspace.
  12. k--; - уменьшение значения переменной k на 1.
  13. s=realloc(s,k+1); - изменение размера строки с помощью функции realloc.
  14. *(s+k)=0; - обнуление последнего символа строки.
  15. else - начало блока условий для обработка других символов.
  16. if(ch!=8 && ch!=9 && ch!=13) - проверка, не является ли текущий символ символом Backspace (8), Tab (9) или Enter (13).
  17. putch(ch); - вывод текущего символа.
  18. k++; - увеличение значения переменной k на 1.
  19. s=realloc(s,k+1); - изменение размера строки с помощью функции realloc.
  20. *(s+k-1)=ch; - запись текущего символа в позицию k-1 в строке.
  21. *(s+k)=0; - обнуление последнего символа строки.
  22. }while( ch != 13 ); - продолжение цикла до тех пор, пока не будет введен символ Enter (13).
  23. printf(\n%s\n,s); - вывод строки s с помощью функции printf.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5