问以下代码的输出:
#include<iostream>
int main()
{
char str[] = "\ta\045pg";
int len = strlen(str);
std::cout << len << std::endl;
return 0;
}
输出为:
解释:以下定义一个指针,指向字符串的对头地址,依次打印五个字符。
#include<iostream>
int main()
{
char str[] = "\ta\045pg";
char* ptr = str;
std::cout << *(ptr ) << std::endl;
std::cout << *(ptr +1) << std::endl;
std::cout << *(ptr +2) << std::endl;
std::cout << *(ptr +3) << std::endl;
std::cout << *(ptr +4) << std::endl;
int len = strlen(str);
int size = sizeof(str);
std::cout <<"len " << len << " size " << size << std::endl;
}
根据如下转义字符表,\t、\045(\ddd),所以字符的len5,size=6(字符默认以’\0‘结尾,所以size=len+1).
那怎么判断\加数字是不是转义字符呢?
以\ddd为例:\ddd为八进制转义字符,最大为\377(因为八进制转义字符占八个二进制的字符常量)。尽管3个八进制数最大为777,对应二进制数为1 1111 1111但因为超过八个字符,\ddd最大的二进制数为1111 1111转换成八进制就是\377。
对于超过\377的情况\abc(其中abc是数字)
case1:
\379,\389之类,某位开始大于7的,只截取前面的\37,\3:
#include<iostream>
int main()
{
char str[] = "\ta\379pg";
int len = strlen(str);
char* ptr = str;
std::cout << *(ptr) << std::endl;
std::cout << *(ptr + 1) << std::endl;
std::cout << *(ptr + 2) << std::endl;
std::cout << *(ptr + 3) << std::endl;
return 0;
}
case2:
\444三个数字,但是超出\377会报错
将会报错:
如果是\931则是字符'9','8','7',因为第一个数字已经超过7,明显不可能是转义字符,\不成立。
#include<iostream>
int main()
{
char str[] = "\ta\931pg";
int len = strlen(str);
char* ptr = str;
std::cout << *(ptr) << std::endl;
std::cout << *(ptr + 1) << std::endl;
std::cout << *(ptr + 2) << std::endl;
std::cout << *(ptr + 3) << std::endl;
std::cout << "len " << len << std::endl;
}