c - 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 循环打印 - 一个字符一个字符,问题仍然存在。我想知道后端过程中实际发生了什么?
解决方案
使用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。
推荐阅读
- python - Python 如何在定义、布尔值、函数之间正确切换?
- python - 元素不可见。raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException
- antlr - antlr3 语法中未忽略的空格
- angular - 分组和减少从ngrx状态树接收的自定义可观察数组
- javascript - 如何使用 nodejs 在服务器上接收与客户端发布数据格式相同的发布数据?
- haskell - 如何在实例函数中专门化参数/数据类型?(哈斯克尔)
- c# - DotVVM - 在 GridView 中为行着色的可能性是什么?
- reactjs - 反应路由器中未定义的反应上下文值
- hyperledger-fabric - 如何使用 raft 在正在运行的超级账本结构网络中添加新的订购者?
- mysql - MySQL SELECT 不适用于包含换行符的文本