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

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

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

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

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

textual
Листинг программы
  1. char ch, *s;
  2. int k = 0;
  3. s=calloc(1,1);
  4. do
  5.  {
  6.     ch = getch( );
  7.     if(!ch) getch();
  8.     else
  9.     if(ch==8 && k)
  10.     {
  11.         putch(8); putch(32); putch(8);
  12.         k--;
  13.         s=realloc(s,k+1);
  14.         *(s+k)=0;
  15.     }
  16.     else
  17.     if(ch!=8 && ch!=9 && ch!=13)
  18.     {
  19.         putch(ch);
  20.         k++;
  21.         s=realloc(s,k+1);
  22.         *(s+k-1)=ch;
  23.         *(s+k)=0;
  24.     }
  25.  }while( ch != 13 );
  26.  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут