C++(6)C风格字符串

C风格字符串


序言:

    尽管现代C++支持C风格字符串,但是不应该在C++程序中使用这个类型。C风格字符串常常带来许多的错误,是导致大量安全问题的根源!

    C风格字符串可以理解为是“以空字符null结尾的数组”.

[cpp]  view plain copy
  1. //请注意下面两条语句的区别  
  2.     char strErr[] = {'C','+','+'};  
  3.     char strOk[] = "C++";  

正文:

1C++通过(const)char*类型的指针来操纵C风格字符串。

[cpp]  view plain copy
  1. const char *str = "some values";  
  2. /* 
  3. *如果str所指的字符串不是以null结尾,那么循环调用会失败, 
  4. *循环从str指向的位置开始读数,直到内存中某处null结束符为止 
  5. */  
  6. while (*str)  
  7. {  
  8.     cout << *str;  
  9.     ++ str;  
  10. }  

2C风格字符串的标准库函数:strncat,strncpy

    1)在使用C风格字符串的标准库函数时,一定不要忘记字符串一定要以null结尾!

[cpp]  view plain copy
  1. //不会有好的结果...  
  2. char str[] = {'C','+','+'};  
  3. cout << strlen(str) << endl;  

    2)如果必须使用C风格字符串,则使用函数 strncat 和 strncpy 会比 strcat 和 strcpy 更加安全

[cpp]  view plain copy
  1. char largeStr[16 + 18 + 2];  
  2.   
  3. strncpy(largeStr,cp1,17);  
  4. /* 
  5. *在调用strncat时,原来用于结束largeStr的null被 
  6. *新添加的空格覆盖,然后在空格后面写入新的结束符null 
  7. */  
  8. strncat(largeStr," ",2);  
  9. strncat(largeStr,cp2,19);  

3、尽量使用string代替

    一是提高了安全性,二是提高了效率!

[cpp]  view plain copy
  1. //P116 习题4.22  解释下面两个程序的区别  
  2. //(1)  
  3. int main()  
  4. {  
  5.     const char *cp = "hello";  
  6.     int cnt = 0;  
  7.   
  8.     while (*cp)  
  9.     {  
  10.         ++cnt;  
  11.         cout << *cp;  
  12.         ++ cp;  
  13.     }  
  14.     cout << '\n' << cnt << endl;  
  15. }  
  16.   
  17. //(2)  
  18. int main()  
  19. {  
  20.     const char *cp = "hello";  
  21.     int cnt = 0;  
  22.   
  23.     while (cp)  
  24.     {  
  25.         ++cnt;  
  26.         cout << *cp;  
  27.         ++ cp;  
  28.     }  
  29.     cout << '\n' << cnt << endl;  
  30. }  

[cpp]  view plain copy
  1. //习题4.23 解释写列程序能够实现什么功能  
  2. int main()  
  3. {  
  4.     const char ca[] = {'H','e','l','l','o'};  
  5.     const char *cp = ca;  
  6.     cout << strlen(cp) << endl;  
  7.     while (*cp)  
  8.     {  
  9.         cout << *cp;  
  10.         ++ cp;  
  11.     }  
  12.     cout << endl;  
  13.     cout << strlen(ca) << endl;  
  14.     cout << strlen(cp) << endl;  
  15. }  

你可能感兴趣的:(C++(6)C风格字符串)