C编程-存储退格字符的打印字符串问题

C编程-存储退格字符的打印字符串问题,c,string,printf,C,String,Printf,我正在编写一个基本的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

我正在编写一个基本的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) ;
}
void print\u word()
{
char ch;
char-str[15];
int i=0;/*i将用作访问str元素的索引*/
printf(“\n输入您选择的单词:”);
ch=getch();/*不回显字符*/
while(!isspace(ch)&&i<14)/*while循环执行,直到用户没有输入空间或str数组已满*/
/*isspace()在头文件中定义*/
{
putchar(ch);/*现在回显字符*/
str[i]=ch;
i++;
ch=getch();
}//当循环结束时
str[i]='\0';
printf(“\t”);//打印间隙
printf(“%s”,str);
printf(“%s”,str);
}
如果用户直接输入单词(无需使用退格编辑单词),此功能将正常工作

假设用户输入“HELLO”,则数组str中存储了5个字符,即“H”“E”“L”“L”“O”。但用户按了三次backspace键,控制台上的单词显示为“HE”,而str现在包含8个字符H-E-L-L-O和3个backspace字符。但是,当执行此代码最后两条语句中的printf函数并打印str时,第一条语句正确打印8个字符并在控制台上显示“HE”,但第二条语句打印“HELLO”,并在数组str中保留3个退格字符

为什么最后一个
printf()
语句没有正确打印字符串str,即为什么没有打印退格字符

即使我使用
put()
函数打印str,或者即使str是使用for循环打印的,也会出现问题。
我想知道后端进程中实际发生了什么?

使用
printf(“%s\n”,str)两次,您将看到第一个printf不打印“HE”。它会像第二个一样打印“HELLO”,然后将光标向后移动3次,因此如果在同一行上打印两个字符串,那么第二个字符串将覆盖第一个“HELLO”的最后3个字符。打印HELLO和3个backspaces后,您已在标记处输出HELLO和光标:

HELLO
  ^
打印您拥有的空间后:

HE LO
   ^
打印另一个HELLO和3个Backspace后:

HE HELLO
     ^
如果需要有关使用退格打印字符串的详细信息,可能需要检查此问题:

如果用户直接输入单词(无需使用退格编辑单词),此功能将正常工作

看这个,

 #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();
}
在一个选项卡(近7个空格)之后,显示console

  "HE       "
一次打印str后

  "HE       HE^LLO"
空间和str的打印后

  "HE       HE HELLO"

作为printf(“%s\n”,str)的替代方案解决方案您可以逐个字符地处理用户的输入

通常,只要程序需要完全控制输入字符,就会使用
getch()
,因此请充分利用它

while
循环中,只需执行以下操作:

while ( !isspace(ch) && i < 14)
{
    putchar(ch);           /* Now echo character */
    if( ch == 0x08 && i > 0)
    {
        i--;
    }
    else
    {
        str[i] = ch ;
        i++ ;
    }
    ch = getch();
} 
while(!isspace(ch)和&i<14)
{
putchar(ch);/*现在回显字符*/
如果(ch==0x08&&i>0)
{
我--;
}
其他的
{
str[i]=ch;
i++;
}
ch=getch();
} 
基本上,您需要检查当前输入字符是否为退格(ASCII值
0x08
)。如果是,则减小输入数组的当前索引以执行字符删除。如果当前索引为0,当然不要这样做


这种方法在诸如解析器之类的应用程序中很常见。

这正是我所缺少的,退格不会擦除屏幕上的前一个字符,它只是将光标向后移动。谢谢你让我明白这一点。处理退格的好方法!感谢您的描述,感谢您的详细解释,以及处理退格的替代方案。我感谢你的帮助。
while ( !isspace(ch) && i < 14)
{
    putchar(ch);           /* Now echo character */
    if( ch == 0x08 && i > 0)
    {
        i--;
    }
    else
    {
        str[i] = ch ;
        i++ ;
    }
    ch = getch();
}