strlen 转义字符









1、

题目如下:

?
1
2
3
4
5
char  s[] = “\\123456\123456\t”;
 
printf (“%d\n”, strlen (s));
 
A 12     B 13    C 16   D 以上都不对

先不说结果如何,我们看看s[]在内存中的结构:

无标题

很清楚,char[13]数组大小为13,答案似乎是B,很不幸错了,strlen返回的长度不包括结尾空白符,答案为A 12。

‘\’为转义符,转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。

下图为转义字符表:

无标题

char s[] = “\\123456\123456\t”;中的\\相对于一个字符\,\123中,1,2,3都满足8进制数,因此\123其实表示一个字符。那么我现在看看为什么内存中显示char s[7] = ‘S’,即\123的值为‘S’??

\ddd 斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制ASCII码值。八进制123换算成十进制 = 1*8*8 + 2*8 + 3 = 83,由ASCII可以看出‘S’对于十进制83,八进制为123。

\x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制ASCII码值。

那么知道了上面的解答,下面一些情况看是怎么样的?

?
1
2
3
4
5
char  s[] = “\123”;  //sizeof(s) = 2; strlen(s) = 1;ok
char  s[] = “\192”;  //sizeof(s) = 4; strlen(s) = 3;因为9不是八进制数,所以\只对1起作用。ok?
char  s[] = “\911”;  //sizeof(s) = 4; strlen(s) = 3;因为9不是八进制,所以\没有起到任何作用。ok?
char  s[] = “\x12”;  //sizeof(s) = 2; strlen(s) = 1;x后面有两位十六进制数,\x12其实是一个字符。ok?
char  s[] = “\x111” //这里编译器会报错:273对字符来说太大。这时编译器会傻傻的把\x后面所有的数字都看成十六进制的数:1*16*16 + 1*16 + 1 = 273,ASCII表最多只有255个字符(下表不全,还有扩展的ASCII),所以\x后面只能跟两个十六进制的数,除非?如下:

*这里有个小小的区别:\ddd 只计算后面3位八进制,而\x会把后面所有的位都计算!

?
1
2
3
4
5
6
7
8
9
10
char  s[] = “\x011”;
char  s[] = “\x00011”;这样不管前面有多少个0, strlen (s) 始终= 1。只要后面不连续出现3个大于0的数(当然编译器会编译报错)。
那么现在再来看看:
char  s[] = “\\123456\0000123456\t”;
sizeof (s) = ?;         // 编译器会把\000,3位八进制数字做转义,即\000其实为一位,等于0,这样长度为:1+6+1+1+6+1+1 = 17
strlen (s) = ?;         // 当遇到\0时,strlen函数会认为字符串到了结尾,因此不再往下计算,所以strlen(s)只计算了“\\123456\0”这段长度,去掉结尾空白符号,返回7
如果是:
char  s[] = “\\123456\0000123456\t\x0000aa”;
sizeof (s) = ?; 
strlen (s) = ?;

(以上程序都在win32,vs2010下测试,不知道到其它环境会不会有区别,如果有,烦请告知,谢谢)

ASCII字符表:

20060922113734

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、



2、

在VC6.0环境或者linux GCC 下 

 char string[]="ab\01";
   printf("%d",strlen(string));

答案是:3

char string[]="ab\012";
   printf("%d",strlen(string));

答案是:3

char string[]="ab\0123";
   printf("%d",strlen(string));

答案是:4

char string[]="ab\01a";
   printf("%d",strlen(string));

答案是:4

 char string[]="ab\0a1";
   printf("%d",strlen(string));

答案是:2

   char string[]="ab\0abc";
   printf("%d",strlen(string));

答案是:2

问题回归:

转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符:
\a 响铃(BEL) 007 
\b 退格(BS) 008 
\f 换页(FF) 012 
\n 换行(LF) 010 
\r 回车(CR) 013 
\t 水平制表(HT) 009 
\v 垂直制表(VT) 011 
\\ 反斜杠 092 
\? 问号字符 063 
\' 单引号字符 039 
\" 双引号字符 034 
\0 空字符(NULL) 000 
\ddd 任意字符 三位八进制 
\xhh 任意字符 二位十六进制

上面程序测试中出现‘\0’,如果后面紧跟的是小于8的数字,那编译器就认为它是八进制数(\ddd 任意字符 三位八进制),算一个字符;如果紧跟的是字符,则'\0'表示空字符。这样,才会导致上述结果出现。欢迎交流~~~


转自:http://www.cnblogs.com/cluster/archive/2011/06/01/2065987.html   http://hi.baidu.com/fly_2009hui/item/c68028ddf439aa15e0f46f80

在C语言中,转义字符是一种以反斜杠“\”开头的特殊字符序列,用于表示那些无法直接输入或显示的字符,例如换行符、制表符、引号等。转义字符的主要用途是增强字符串的表达能力,使其能够包含控制字符或特殊符号。 ### 常见的转义字符及其含义 以下是一些常用的转义字符及其功能[^3]: | 转义字符 | 含义 | ASCII值 | |----------|------------------|---------| | `\n` | 换行符 | 10 | | `\t` | 水平制表符 | 9 | | `\b` | 退格符 | 8 | | `\r` | 回车符 | 13 | | `\f` | 换页符 | 12 | | `\\` | 反斜杠 | 92 | | `\"` | 双引号 | 34 | | `\'` | 单引号 | 39 | | `\a` | 响铃符(警报) | 7 | | `\v` | 垂直制表符 | 11 | | `\0` | 空字符(字符串结束符) | 0 | ### 转义字符的使用方法 在字符串或字符常量中,使用反斜杠“\”后跟特定字符即可表示一个转义字符。例如: - `printf("Hello\tWorld\n");` 将输出“Hello”和“World”之间插入一个制表符,并在输出后换行[^2]。 - 若要在字符串中表示一个真正的反斜杠“\”,必须使用“\\”,因为单独的“\”会被解释为转义字符的开始。 #### 示例代码: ```c #include <stdio.h> int main() { printf("This is a tab:\tand this is after tab.\n"); printf("This is a newline:\n"); printf("This is a backslash: \\\\ \n"); printf("This is a double quote: \" \n"); return 0; } ``` 上述代码的输出为: ``` This is a tab: and this is after tab. This is a newline: This is a backslash: \ This is a double quote: " ``` ### 注意事项 - 转义字符在字符串常量和字符常量中具有特殊意义。 - 在使用 `printf` 或 `scanf` 等函数时,转义字符会被解释为对应的控制功能。 - 当使用 `strlen` 函数计算字符串长度时,每个转义字符被视为一个字符[^2]。 ### 示例分析 例如,`strlen("c\768code-c++\test")` 中的转义字符 `\76` 是一个八进制表示的 ASCII 字符(对应字符 `'N'`),而 `\t` 是水平制表符,`\e` 并不是标准的 C 语言转义字符,因此会被视为两个独立字符 `'\'` 和 `'e'`。最终字符串长度取决于这些字符的实际表示。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值