1. 问题
请问字符串"\tac\b\b\x41\nc\104\""的长度是多少?
2. 解答
该字符串的长度为10。这10个字符分别是水平制表符'\t','a','c',两个退格符'\b','\x41'对应的字符’A',换行符'\n','c',’\104'对应的字符'D',还有字符'\"',其中,'\t'、'\b'、'\x41'、'\n'、’\104'和'\"'都是转义字符,'\x41'表示十六进制数,’\104'表示八进制数,它们对应的字符分别是'A'和'D'。
针对这个问题,我们再深入思考,如果要打印输出该字符串,显示的结果是什么呢?
我们先来分析转义字符,其他字符原样输出即可。
'\t'水平制表符,由于它是输出的第一个字符,所以,会显示8个空格。
'\b'退格符,该字符对应键盘上的退格键。我们平时在编辑文本时,使用该按键,光标回退一个字符位置,并删除该位置前字符。
'\x41'输出A
'\n'换行
’\104'输出D
'\"'输出"
根据以上分析,输出结果应该是两行,分别是:
A
cD"
其中第1行输出8个空格和一个字符A,第二行输出cD"这3个字符。
请问:以上分析正确吗?
让我们通过实验来验证吧。请分析下面的程序。
#include <stdio.h>
#include <string.h>
int main ()
{
char str[]="\tac\b\b\b\x41\nc\104\"";
printf("str的长度:%d\n",strlen(str));
printf("str占用空间大小:%u\n",sizeof(str));
printf("1234567890\n");
printf ("%s",str);
return 0;
}
程序运行结果如下:
显然,程序运行结果与我们分析的结果不一样啊!这是为什么呢?
原因是退格符'\b'的问题,在一些应用程序或操作系统中,每当在文字编辑或输入命令时,当按一次退格键,应用程序或操作系统会使光标回退一个位置,并将该位置的字符清除。也就是说退格键的作用是使光标回退一个位置,清除该位置的字符是操作系统或应用程序给这个按键增加的功能。而在我们这个程序中,我们只是显示字符串中各个字符,并没有对每个字符进行处理,也就是说只显示了'\b'字符,并没有清除光标处的字符,因此,我们看到的结果是光标回退了一个位置,该位置上的字符并没有清除,因为我们的程序没有实现这项功能。按这个思路,我们再来分析字符串的输出情况如下:
\tac 这部分输出水平制表符和ac,即8个空格和ac,
ac
\b\b这两个字符是退格键,让光标往回移动两个字符位,即光标在a字符处,因没显示一个字符,光标会移动到下一个位置。
\x41\n这两个字符是‘A’和换行符,因此输出A然后光标回到下一行。此时看到的输出是
Ac
最后输出c\104\"这三个字符,其中’\104‘是字符'D',这3个字符序列是cD",因此,真实的输出结果是:
Ac
cD"