字符串,注意!!

来源:互联网 发布: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)