首页 > 解决方案 > 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) ;
}

如果用户直接输入单词(不使用退格键编辑单词),此功能可以正常工作。

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

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

即使我用puts()函数打印 str 或者即使 str 用 for 循环打印 - 一个字符一个字符,问题仍然存在。我想知道后端过程中实际发生了什么?

标签: cstringprintf

解决方案


使用printf("%s\n", str);两次,你会发现第一个 printf 没有打印“HE”。它像第二个一样打印“HELLO”,然后将光标向后移动 3 次,因此如果您在同一行上打印两个字符串,那么第二个字符串会覆盖第一个“HELLO”的最后 3 个字符。打印 HELLO 和 3 个退格后,您已输出 HELLO 并将光标置于标记处:

HELLO
  ^

打印空间后,您拥有:

HE LO
   ^

打印另一个 HELLO 和 3 个退格键后:

HE HELLO
     ^

如果您想了解有关使用退格打印字符串的更多信息,您可能需要检查此问题:Function printf() to print backspace problem


推荐阅读