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

图片

'\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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhw---9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值