C编程-存储退格字符的打印字符串问题
我正在编写一个基本的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
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();
}