阅读背景:

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

来源:互联网 
    char *s="\ta
    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
可见是溢出了,但为什么,不太清楚.
哪位帮解释一下,来龙去脉.

19 个解决方案

#1


*s!='\0'

#2


\ta8bc  最后i==7; 循环执行了6次! 

#3


'\t' 'a' '\01' '8' 't' 'c'

#4


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

#5



#include <stdio.h>

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

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

        return 0;
}

#6


'\01'代表什么 为什么ASII值是1

#7


??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~

#8


字符串中'\'代表转义

#9


引用 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

up

#10


引用 7 楼 sun31009 的回复:
??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~

我也有此疑惑~~~但是编译器编译成了\01~~~

#11


 for(; s!='\0';s++)   -->   *s!='\0'

'\t' 'a' '\01' '8' 't' 'c' 循环六次

#12


\01 是八进制的转义符, 去掉0也是一样的

#13


呵呵,楼上的正解。

#14


引用楼主 ltolll 的帖子:
void main() 
{   long i; 
    char *s="\ta\018bc"; 
    for(i=1;s!='\0';s++) 
        i++; 
    printf("%d",i); 

结果:-403 


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

因为楼主这样写相当于,当s!=0的时候,就一直i++
由于在很久才遇到s==0,结果由于i不断累加,产生了溢出,所以就输出了-403当然,这个数是不确定的,取决于什么时候遇到s==0

#15


void main()
{   long i;
    char *s="\ta\018bc";
    char *ptr;
        ptr=s;
        while(*ptr)
        printf("%d,",*ptr++);
    printf("%d",i);
}
~
~

#16


<<C程序设计>>谭浩强著第三版,
P40:以0开头的数是八进制数
P48:转义字符及其作用中,\ddd,其中ddd为1到3位八进制数所代表的字符

1到3位那是多少位都行但是八进制没有8,所以8作为另一个字符

#17


不懂为什么是6次的可以把 char *s="\ta\018bc"; 
换成 char *s="\ta\017bc"; 
试试就是5次了。\017整个解释成8进制。\018就解释成八进制\01和8两个字符了

#18


大家都讨论的这么深入了,俺就放点理论知识出来。
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。 

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

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

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,这个内容,大家仅仅了解就行。

#19


mark

8bc";
    for(;s!='
    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
可见是溢出了,但为什么,不太清楚.
哪位帮解释一下,来龙去脉.

19 个解决方案

#1


*s!='\0'

#2


\ta8bc  最后i==7; 循环执行了6次! 

#3


'\t' 'a' '\01' '8' 't' 'c'

#4


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

#5



#include <stdio.h>

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

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

        return 0;
}

#6


'\01'代表什么 为什么ASII值是1

#7


??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~

#8


字符串中'\'代表转义

#9


引用 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

up

#10


引用 7 楼 sun31009 的回复:
??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~

我也有此疑惑~~~但是编译器编译成了\01~~~

#11


 for(; s!='\0';s++)   -->   *s!='\0'

'\t' 'a' '\01' '8' 't' 'c' 循环六次

#12


\01 是八进制的转义符, 去掉0也是一样的

#13


呵呵,楼上的正解。

#14


引用楼主 ltolll 的帖子:
void main() 
{   long i; 
    char *s="\ta\018bc"; 
    for(i=1;s!='\0';s++) 
        i++; 
    printf("%d",i); 

结果:-403 


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

因为楼主这样写相当于,当s!=0的时候,就一直i++
由于在很久才遇到s==0,结果由于i不断累加,产生了溢出,所以就输出了-403当然,这个数是不确定的,取决于什么时候遇到s==0

#15


void main()
{   long i;
    char *s="\ta\018bc";
    char *ptr;
        ptr=s;
        while(*ptr)
        printf("%d,",*ptr++);
    printf("%d",i);
}
~
~

#16


<<C程序设计>>谭浩强著第三版,
P40:以0开头的数是八进制数
P48:转义字符及其作用中,\ddd,其中ddd为1到3位八进制数所代表的字符

1到3位那是多少位都行但是八进制没有8,所以8作为另一个字符

#17


不懂为什么是6次的可以把 char *s="\ta\018bc"; 
换成 char *s="\ta\017bc"; 
试试就是5次了。\017整个解释成8进制。\018就解释成八进制\01和8两个字符了

#18


大家都讨论的这么深入了,俺就放点理论知识出来。
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。 

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

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

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,这个内容,大家仅仅了解就行。

#19


mark

';s++)     for(;s!='
    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
可见是溢出了,但为什么,不太清楚.
哪位帮解释一下,来龙去脉.

19 个解决方案

#1


*s!='\0'

#2


\ta8bc  最后i==7; 循环执行了6次! 

#3


'\t' 'a' '\01' '8' 't' 'c'

#4


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

#5



#include <stdio.h>

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

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

        return 0;
}

#6


'\01'代表什么 为什么ASII值是1

#7


??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~

#8


字符串中'\'代表转义

#9


引用 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

up

#10


引用 7 楼 sun31009 的回复:
??不是遇到'\0'就停了吗?"\ta\018bc"中间出现'\0'了啊~怎么还会继续往后啊~

我也有此疑惑~~~但是编译器编译成了\01~~~

#11


 for(; s!='\0';s++)   -->   *s!='\0'

'\t' 'a' '\01' '8' 't' 'c' 循环六次

#12


\01 是八进制的转义符, 去掉0也是一样的

#13


呵呵,楼上的正解。

#14


引用楼主 ltolll 的帖子:
void main() 
{   long i; 
    char *s="\ta\018bc"; 
    for(i=1;s!='\0';s++) 
        i++; 
    printf("%d",i); 

结果:-403 


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

因为楼主这样写相当于,当s!=0的时候,就一直i++
由于在很久才遇到s==0,结果由于i不断累加,产生了溢出,所以就输出了-403当然,这个数是不确定的,取决于什么时候遇到s==0

#15


void main()
{   long i;
    char *s="\ta\018bc";
    char *ptr;
        ptr=s;
        while(*ptr)
        printf("%d,",*ptr++);
    printf("%d",i);
}
~
~

#16


<<C程序设计>>谭浩强著第三版,
P40:以0开头的数是八进制数
P48:转义字符及其作用中,\ddd,其中ddd为1到3位八进制数所代表的字符

1到3位那是多少位都行但是八进制没有8,所以8作为另一个字符

#17


不懂为什么是6次的可以把 char *s="\ta\018bc"; 
换成 char *s="\ta\017bc"; 
试试就是5次了。\017整个解释成8进制。\018就解释成八进制\01和8两个字符了

#18


大家都讨论的这么深入了,俺就放点理论知识出来。
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。 

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

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

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,这个内容,大家仅仅了解就行。

#19


mark

';s++



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: