"\ta\018bc"是多少个字符?

ltolll 2008-05-26 01:24:50
char *s="\ta\018bc";
for(;s!='\0';s++)
printf("%d",i);
问:循环执行多少次?
答案是6,我觉得是5
用TC跑一下,改装如下:
void main()
{ long i;
char *s="\ta\018bc";
for(i=1;s!='\0';s++)
i++;
printf("%d",i);
}
结果:-403
可见是溢出了,但为什么,不太清楚.
哪位帮解释一下,来龙去脉.
...全文
2049 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lp_2007 2008-05-26
  • 打赏
  • 举报
回复
mark
hnist0312 2008-05-26
  • 打赏
  • 举报
回复
大家都讨论的这么深入了,俺就放点理论知识出来。
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。 

我们学过用一个转义符'\'加上一个特殊字母来表示某个字符的方法,如:'\n'表示换行(line),而'\t'表示Tab字符,'\''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'\'后面接一个八进制数,用于表示ASCII码等于该值的字符。

比如,问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,这个内容,大家仅仅了解就行。
THEBEST 2008-05-26
  • 打赏
  • 举报
回复
不懂为什么是6次的可以把 char *s="\ta\018bc";
换成 char *s="\ta\017bc";
试试就是5次了。\017整个解释成8进制。\018就解释成八进制\01和8两个字符了
  • 打赏
  • 举报
回复 1
<<C程序设计>>谭浩强著第三版,
P40:以0开头的数是八进制数
P48:转义字符及其作用中,\ddd,其中ddd为1到3位八进制数所代表的字符

1到3位那是多少位都行但是八进制没有8,所以8作为另一个字符
cceczjxy 2008-05-26
  • 打赏
  • 举报
回复
void main()
{ long i;
char *s="\ta\018bc";
char *ptr;
ptr=s;
while(*ptr)
printf("%d,",*ptr++);
printf("%d",i);
}
~
~
bysdy 2008-05-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 ltolll 的帖子:]
void main()
{ long i;
char *s="\ta\018bc";
for(i=1;s!='\0';s++)
i++;
printf("%d",i);
}
结果:-403
[/Quote]

for(i=1;s!='\0';s++)
i++;
printf("%d",i); //这句话不在for循环里面

因为楼主这样写相当于,当s!=0的时候,就一直i++
由于在很久才遇到s==0,结果由于i不断累加,产生了溢出,所以就输出了-403当然,这个数是不确定的,取决于什么时候遇到s==0
hnist0312 2008-05-26
  • 打赏
  • 举报
回复
呵呵,楼上的正解。
xiaozhiwei 2008-05-26
  • 打赏
  • 举报
回复
\01 是八进制的转义符, 去掉0也是一样的
liyinlei 2008-05-26
  • 打赏
  • 举报
回复
for(;s!='\0';s++) --> *s!='\0'

'\t' 'a' '\01' '8' 't' 'c' 循环六次
davelv 2008-05-26
  • 打赏
  • 举报
回复 1
[Quote=引用 7 楼 sun31009 的回复:]
??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~
[/Quote]
我也有此疑惑~~~但是编译器编译成了\01~~~
zgl90k 2008-05-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 k2eats 的回复:]
C/C++ codeintmain()
{inti=0;constchar*s="\ta\018bc";char*ps=s;for(;*ps!='\0';ps++)
{
i++;
printf("%c",*ps);
}
printf("\n%d",i);
getch();return0;
}
结果:
a☺8bc
6
[/Quote]
up
K行天下 2008-05-26
  • 打赏
  • 举报
回复
字符串中'\'代表转义
sun31009 2008-05-26
  • 打赏
  • 举报
回复
??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~
wbyhzh1111 2008-05-26
  • 打赏
  • 举报
回复
'\01'代表什么 为什么ASII值是1
ForestDB 2008-05-26
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
int i;
char *s = "\ta\018bc";

i = printf("%s", s);
printf("\n%d\n", i);

return 0;
}
K行天下 2008-05-26
  • 打赏
  • 举报
回复
int main()
{ int i = 0;

const char *s="\ta\018bc";
char* ps = s;

for(;*ps != '\0';ps++)
{
i++;
printf("%c",*ps);
}
printf("\n%d",i);
getch();
return 0;
}

结果:
a☺8bc
6
hou1104 2008-05-26
  • 打赏
  • 举报
回复
'\t' 'a' '\01' '8' 't' 'c'
clhposs 2008-05-26
  • 打赏
  • 举报
回复
\ta8bc 最后i==7; 循环执行了6次!
clhposs 2008-05-26
  • 打赏
  • 举报
回复
*s!='\0'

70,023

社区成员

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

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