C语言辨析——这个字符串长度是多少?

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'退格符,该字符对应键盘上的退格键。我们平时在编辑文本时,使用该按键,光标回退一个字符位置,并删除该位置前字符。

C语言辨析——这个字符串长度是多少?_第1张图片

'\x41'输出A

'\n'换行

’\104'输出D

'\"'输出"

根据以上分析,输出结果应该是两行,分别是:

        A

cD"

其中第1行输出8个空格和一个字符A,第二行输出cD"这3个字符。

请问:以上分析正确吗?

让我们通过实验来验证吧。请分析下面的程序。


#include 
#include  
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;
}

程序运行结果如下:

C语言辨析——这个字符串长度是多少?_第2张图片

显然,程序运行结果与我们分析的结果不一样啊!这是为什么呢?

原因是退格符'\b'的问题,在一些应用程序或操作系统中,每当在文字编辑或输入命令时,当按一次退格键,应用程序或操作系统会使光标回退一个位置,并将该位置的字符清除。也就是说退格键的作用是使光标回退一个位置,清除该位置的字符是操作系统或应用程序给这个按键增加的功能。而在我们这个程序中,我们只是显示字符串中各个字符,并没有对每个字符进行处理,也就是说只显示了'\b'字符,并没有清除光标处的字符,因此,我们看到的结果是光标回退了一个位置,该位置上的字符并没有清除,因为我们的程序没有实现这项功能。按这个思路,我们再来分析字符串的输出情况如下:

\tac 这部分输出水平制表符和ac,即8个空格和ac,

    ac

\b\b这两个字符是退格键,让光标往回移动两个字符位,即光标在a字符处,因没显示一个字符,光标会移动到下一个位置。

\x41\n这两个字符是‘A’和换行符,因此输出A然后光标回到下一行。此时看到的输出是

    Ac

最后输出c\104\"这三个字符,其中’\104‘是字符'D',这3个字符序列是cD",因此,真实的输出结果是:

    Ac

cD"

你可能感兴趣的:(c语言)