"t\x03est\x03t"字符串中,第二个是什么

lbjfeng 2009-10-14 03:05:04
大家不用编译器之前,谁知道??

char buffer[] = "t\x03est\x03t";
buffer[1]是多少???








谁能给我解释一下???我知道结果,并且有朦胧的猜测,但是,字符本来的标示就是\xHH或者是\ddd,为啥0不行??
...全文
310 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbjfeng 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 ljc998 的回复:]
引用 17 楼 dhchenw 的回复:
#include <stdio.h>
int main()
{
char buffer[] = "\x53est\x03t";
int i;
for(i=0;i <6;i++)
{printf("%c\n",buffer[i]);}
}
这样会有警告 [Warning] C:\Program Files\C-Free 4\temp\未命名1.c:4: warning: escape sequence out of range for character
但是输出还是
>

而为什么"\x53est\x03t"这个字符串会报:
Compiling...
test.cpp
E:\test\test.cpp(4) : error C2022: '1342' : too big for character
Error executing cl.exe.

test.exe - 1 error(s), 0 warning(s)
这样一个错误,也就是说这个时候编译器将\x53e进行了转义,根据这个道理,依次类推:
如果字符串是"\x53efst\x03t",编译器将\x53ef进行转义。
进一步可以推理:
如果是char b='\x53ef'也会出现上述类似的编译错误。
由此可以看出,VC的编译器对\xhh的转义其实不是说\x后面只有两位数进行转义,而是说\x后面紧挨着只要是"0123456789abcef"这些字符都要进行转义,也就是属于十六进制范围内的字符。
其他编译器未进行测试,可以测试gcc/g++的编译情况。
[/Quote]

呵呵,不错不错·~~
Jenuce 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dhchenw 的回复:]
#include <stdio.h>
int main()
{
char buffer[] = "\x53est\x03t";
int i;
for(i=0;i <6;i++)
{printf("%c\n",buffer[i]);}
}
这样会有警告 [Warning] C:\Program Files\C-Free 4\temp\未命名1.c:4: warning: escape sequence out of range for character
但是输出还是
>
[/Quote]
而为什么"\x53est\x03t"这个字符串会报:
Compiling...
test.cpp
E:\test\test.cpp(4) : error C2022: '1342' : too big for character
Error executing cl.exe.

test.exe - 1 error(s), 0 warning(s)
这样一个错误,也就是说这个时候编译器将\x53e进行了转义,根据这个道理,依次类推:
如果字符串是"\x53efst\x03t",编译器将\x53ef进行转义。
进一步可以推理:
如果是char b='\x53ef'也会出现上述类似的编译错误。
由此可以看出,VC的编译器对\xhh的转义其实不是说\x后面只有两位数进行转义,而是说\x后面紧挨着只要是"0123456789abcef"这些字符都要进行转义,也就是属于十六进制范围内的字符。
其他编译器未进行测试,可以测试gcc/g++的编译情况。
Jenuce 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mstlq 的回复:]
引用 3 楼 lbjfeng 的回复:
引用 2 楼 wanjingwei 的回复:
03e一起解释成ascii表里的62了,对应>
对应>。只是,为什么忽略了我的0那???????????


没忽略,十六进制03e就是3e
就像十进制0123就是123一样!
[/Quote]
说的对,03e就是3e。不要认为\x03e在一个字符串char buffer[] = "t\x03est\x03t"里面,就认为0是一个字符,而是把\x03e进行转义后当作一个字符。如果还有疑问,可以调试,看看这个字符串的内存值。
yutaooo 2009-10-15
  • 打赏
  • 举报
回复

解决方案就用mstlq在18楼写出的。这个很好很强大。顶之~
yutaooo 2009-10-15
  • 打赏
  • 举报
回复

用"hex escape sequence out of range" google了一下。

大致上说,\x 是贪婪取其后的字符序列。这一点依照c99规范6.4.4.4,第7点。原话如下:

Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

lbjfeng 2009-10-15
  • 打赏
  • 举报
回复
“”“”,太奇怪了~~~


期待那位大贤者,帮忙瞅瞅~~~
lbjfeng 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mstlq 的回复:]
楼主玩玩这个吧……
有没有副作用我不知道
C/C++ code
#include<stdio.h>int main()
{char buffer[]="\x53""est\x03t";int i;for (i=0;i<6;i++)
{
printf("%c\n",buffer[i]);
}
}
[/Quote]

为什么结果是忽略掉了中间的“”并且,buffer还可以这样子赋值???
lbjfeng 2009-10-15
  • 打赏
  • 举报
回复
每个八进制或十六进制的换码顺序 都是 所有能够组成换码顺序的字节中 最长的
mstlq 2009-10-14
  • 打赏
  • 举报
回复
楼主玩玩这个吧……
有没有副作用我不知道

#include <stdio.h>
int main()
{
char buffer[] = "\x53""est\x03t";
int i;
for (i=0;i <6;i++)
{
printf("%c\n",buffer[i]);
}
}
dhchenw 2009-10-14
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
char buffer[] = "\x53est\x03t";
int i;
for(i=0;i<6;i++)
{printf("%c\n",buffer[i]);}
}
这样会有警告 [Warning] C:\Program Files\C-Free 4\temp\未命名1.c:4: warning: escape sequence out of range for character
但是输出还是
>
sweetjian 2009-10-14
  • 打赏
  • 举报
回复
补充下15楼
确实忽略了x后面一位,不知道为什么
sweetjian 2009-10-14
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;
int main(){
char a[]="t\x13est\x03et";
int i=0;
while(a[i]){
cout<<a[i]<<endl;
i++;
}
}

试了下输出
t
>
s
t
>
t

MinGW编译器
lbjfeng 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 caicai_vxworks 的回复:]
很奇怪 好像\x后面要读3个字符做16进制
我将"t\x03est\x03t";改成"t\x13est\x03et";
就报错E:\c++资料\test12\test12.c(4) : error C2022: '318' : too big for character
十六进制13e正好是318
[/Quote]

估计是C编译器,认为是咱们兄弟写错了那~~
lbjfeng 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mstlq 的回复:]
引用 3 楼 lbjfeng 的回复:
引用 2 楼 wanjingwei 的回复:
03e一起解释成ascii表里的62了,对应>
对应>。只是,为什么忽略了我的0那???????????


没忽略,十六进制03e就是3e
就像十进制0123就是123一样!
[/Quote]

其实,我也知道一定是给忽略掉了~~~~
但是,这样子,我写就不方便了~~~~~~~

为啥要省略掉0那。我还专门添上0
dhchenw 2009-10-14
  • 打赏
  • 举报
回复
第一个输出t,第二个把0x03e当作一个十六进制的字符,输出 ASCII码是62,输出%c类型的 ' >'
mstlq 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lbjfeng 的回复:]
引用 2 楼 wanjingwei 的回复:
03e一起解释成ascii表里的62了,对应>
对应>。只是,为什么忽略了我的0那???????????
[/Quote]

没忽略,十六进制03e就是3e
就像十进制0123就是123一样!
lbjfeng 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sweetjian 的回复:]
标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位);
318>254
[/Quote]

晕,我们这一点其实其实都明白

但是,根据字符规定,\xhh,\ddd才是三位·`~
caicai_vxworks 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sweetjian 的回复:]
标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位);
318>254
[/Quote]
...哥哥 欺负我不懂!!劈了你
那啥我是奇怪为什么\x后面要取3个字符 至于318大于254会导致错误这个还是明白的
sweetjian 2009-10-14
  • 打赏
  • 举报
回复
标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位);
318>254
lbjfeng 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 caicai_vxworks 的回复:]
很奇怪 好像\x后面要读3个字符做16进制
我将"t\x03est\x03t";改成"t\x13est\x03et";
就报错E:\c++资料\test12\test12.c(4) : error C2022: '318' : too big for character
十六进制13e正好是318
[/Quote]

是的·~
我也奇怪着那·~~



期待那位大哥,显现神威,帮忙看看,这个是为什么那??

加载更多回复(6)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧