字符串,注意!!
来源:互联网 发布:pop3的端口号 编辑:程序博客网 时间:2024/05/08 03:42
字符串使用注意事项:
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
结果是:0 0 1 1
解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;
而str5,str6,str7,str8是指针,它们指向相同的常量区域。这就是数组和指针的最大区别。
另外:
关键字const有什么含意?
答 :1)表示常量不可以修改的变量。
2)可以修饰参数,作为输入参数.
3)修饰函数,防止以外的改动.
4)修饰类的成员函数,不改变类中的数据成员.
char * const p;
char const * p
const char *p
解答:注意 可以根据const 所在的位置(最靠近const右边的那个)决定哪个是不可变的。
char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改。
const关键字至少有下列n个作用:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值
操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。
int main()
{
char* src = "hello,world";
strlen得到的是除字符串结束标记外的所有字符的个数.
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为分配一个空间 分配大小要确定好
char* d = dest;
char* s = &src[len-1]; //指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0; //尾部要加’\0’ 注意尾部空字符
printf("%sn",dest);
free(dest); // 使用完,应当释放空间,以免造成内存汇泄露
dest = NULL; //防止产生野指针
return 0;
}
strncpy函数可以控制需要复制的字符个数,程序员可以通过这个参数提高程序的安全性,不过在VC2005及以上版本中仍然会有一个警告,因为如果程序员自身在设置这个参数时出错的话(比如
设置的字符个数超出缓冲区可以容纳的字符个数),这个函数还是会像strcpy一样执行。
2分
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != '’ );
}
4分
void strcpy( char *strDest, const char *strSrc )
//将源字符串加const,表明其为输入参数,加2分
{
while( (*strDest++ = * strSrc++) != '’ );
}
7分
void strcpy(char *strDest, const char *strSrc)
{
//对源地址和目的地址加非0断言,加3分
assert( (strDest != NULL) && (strSrc != NULL) );
while( (*strDest++ = * strSrc++) != '’ );
}
10分
//为了实现链式操作,将目的地址返回,加3分!
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '’ );
return address;
}
int main(int argc, char *argv[])
{
int a[5]={1,2,3,4,5};
int *_ptr=(int *)(&a+1);
//&a+1不是首地址+1,系统会认为加一个a数组的偏移,_ptr超出了a数组的边界。
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,
不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int)
printf("%d",*(_ptr-1));
return 0;
}
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错?
答: "AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。
cosnt char* s="AAA";
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。
C中的数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址。小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0。大端的话则
1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i,则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。
如:0x1234, 大端读取为12时,小端独到的是34。
需要考虑大小端(字节顺序)的情况
1、所写的程序需要向不同的硬件平台迁移,说不定哪一个平台是大端还是小端,为了保证可移植性,一定提前考虑好。
2. 在不同类型的机器之间通过网络传送二进制数据时。
short 或者 long的数据在进行通信的时候最好养成:
1、发送的时候使用:htons(l)
2、接受的时候使用:ntohs(l)
- 字符串,注意!!
- 注意字符串常量
- 字符串操作注意
- 分割字符串注意总结
- 字符串的输入注意
- 计算字符串长度注意
- 字符串切割componetsSeparatedByString注意
- 字符串复制注意问题
- split截取字符串注意
- javascript字符串注意点
- JAVA分割字符串注意问题
- 拷贝字符串注意拷贝'/0'
- oracle写长字符串注意
- JAVA分割字符串注意问题
- javascirpt设置字符串类型注意
- strtok分割字符串注意点
- 字符串处理,注意越界问题
- java字符串split时注意
- JDK监控和故障处理工具-jmap[转自Oracle]
- 在cmd里面运行adb命令的时候提示:adb server is out of date. killing...
- 提高tomcat内存
- 数据结构 uva-699-The Falling Leaves
- A的href和onclick
- 字符串,注意!!
- 编写简单一个程序 将一个长整型数据 写入字节数组中,在从字节数组中读出来
- [Android实例] android数据库升级
- jQuery实现Select多选列表双击选中项时相互添加
- 网站
- 【算法练习】二分法查询
- 苹果下的建模
- C/C++代码格式优化工具----astyle
- SDWebImage库结构的简单分析 SDWebImage库的作用