C программирование - проблемы с печатью строки с сохраненными символами возврата - PullRequest
1 голос
/ 15 марта 2020

Я пишу основную c C программу, которая принимает слово от пользователя в качестве ввода и печатает это слово дважды в одной строке. Проблема, с которой я сталкиваюсь при печати слова дважды, упоминается после кода, который я написал ниже для выполнения этой работы

void print_word()
{
    char ch; 
    char str[15];
    int i = 0;                /* i will be used as index to access the elements of str */

    printf ("\n Enter a word of your choice : ") ;

    ch = getch() ;         /* Dont echo character */

    while ( !isspace(ch) && i < 14)     /* while loop executes till user doesn't input a space or until the str array is full */
                                        /* isspace() is defined in header file <ctype.h> */
    {
        putchar(ch);           /* Now echo character */
        str[i] = ch ;
        i++ ;
        ch = getch();
    }    //while loop ends

    str[i] = '\0' ;

    printf("\t") ;          //print a gap
    printf ("%s ", str) ;
    printf ("%s", str) ;
}

Эта функция работает правильно, если пользователь вводит слово напрямую (без использования клавиши Backspace для редактирования слово).

Предположим, что пользователь вводит 'HELLO', затем 5 символов, а именно 'H' 'E' 'L' 'L' 'O' сохраняется в массиве str. Но затем пользователь нажимает клавишу Backspace три раза, и на консоли появляется слово «HE», а str теперь содержит восемь символов HELLO и 3 символа Backspace. Но когда функция printf в двух последних операторах этого кода выполняется и печатает str, первый оператор правильно печатает 8 символов и отображает «HE» на консоли, а второй оператор печатает «HELLO», оставляя 3 символа возврата на одну позицию, которые также есть в массиве str.

Почему последний оператор printf() неправильно печатает строку str, т. е. почему он не печатает символы возврата на одну позицию?

Проблема остается, даже если я печатаю str с помощью функции puts() или даже если str печатается с символом l oop - символ за символом. И я хочу знать, что на самом деле происходит в бэкэнд-процессе?

Ответы [ 3 ]

1 голос
/ 15 марта 2020

В качестве альтернативы решению printf("%s\n",str); вы можете обрабатывать символ с помощью символа ввода вашего пользователя.

Обычно getch() используется всякий раз, когда программам требуется полный контроль над вводимыми символами, поэтому воспользуйтесь этим. .

В вашем while l oop просто сделайте это вместо:

while ( !isspace(ch) && i < 14)
{
    putchar(ch);           /* Now echo character */
    if( ch == 0x08 && i > 0)
    {
        i--;
    }
    else
    {
        str[i] = ch ;
        i++ ;
    }
    ch = getch();
} 

В основном вам нужно проверить, является ли текущий вводимый символ пробелом (значение ASCII 0x08 ). Если это так, уменьшите текущий индекс входного массива, чтобы выполнить удаление символа. Конечно, не делайте этого, если текущий индекс равен 0.

Этот подход распространен в таких приложениях, как парсеры AT.

1 голос
/ 15 марта 2020

Используйте printf("%s\n", str); оба раза, и вы увидите, что первый printf не печатает 'HE'. Он печатает 'HELLO', как и второй, просто после этого он перемещает курсор назад 3 раза, поэтому, если вы печатаете обе строки в одной строке, то вторая строка перезаписывает последние 3 символа первого 'HELLO'. После печати HELLO и 3-х обратных символов вы выводите HELLO и курсор на отметку:

HELLO
  ^

. После печати у вас есть:

HE LO
   ^

После печати еще одного HELLO и 3-х возврата:

HE HELLO
     ^

Возможно, вы захотите проверить этот вопрос, если хотите получить больше информации о печати строк с возвратом: Функция printf () для печати проблемы с возвратом .

0 голосов
/ 15 марта 2020

Эта функция работает правильно, если пользователь вводит слово напрямую (без использования клавиши Backspace для редактирования слова).

См.,

 #include<stdio.h>
 #include<conio.h>

 void print_word()
 {
    char ch;
    char str[15];
    int i = 0,flag=0;

    printf ("\n Enter a word of your choice : ") ;

    for(i=0; i<15&&flag==0; ++i)
    {
    ch = getch();
    switch(ch)
    {
      case 13:
         str[i] = '\0';
         flag=1;
         break;
      case '\b':
         if(i>0) i--;
         str[i--]='\0';
         printf("\b \b");
         break;
      default:
         str[i] = ch;
         printf("%c",ch);
    }
    }
    str[15]='\0';

    printf("\t") ;
    printf ("%s ", str) ;
    printf ("%s", str) ;

}

int main()
{
    print_word();
}

Вы несете ответственность для удаления возврата из строки.

Почему последний оператор printf () не печатает строку str должным образом, т. е. почему он не печатает символы возврата назад ??

Ваш ввод: HELLO + (3 пробела)

, поэтому str содержит {'H','E','L','L','O','\b','\b','\b'}

, а точка пересечения в консоли -

  "HE^LLO"

После одной вкладки (почти 7 пробелов) ), поэтому консоль появляется

  "HE       "

после одного отпечатка str

  "HE       HE^LLO"

после печати пробела и str

  "HE       HE HELLO"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...