C风格字符串(C—style character string)

来源:互联网 发布:怎么设计淘宝首页 编辑:程序博客网 时间:2024/05/05 18:37

C风格字符串,就是以空字符null结束的字符数组。

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

C风格字符串的标准库函数:#include <string.h>即可。C++中还可用 #include <cstring>。

 

有关C风格字符串的函数:

在string.h中包含的关于字符串操作的库函数中,通常都有类型为cosnt char * p的参数,这种参数的意义是:要求传递一个字符指针,而且在函数的实现中不通过该字符指针改变其所指向的字符的值。实际上加上const起到了保护作用,当在函数体中视图通过*p来修改p指向的字符值时,编译出错。但是,我们知道,strcpy等函数是库函数,是早就定义好的正确的函数,它当然不会在自己的函数体中修改*p,那么加上const有什么意义呢?

实际上,在函数参数前加上const只是提醒程序员,我这个函数(函数体内)不会修改*p,你最好传递这样一个实参p来,p所指向的字符为const类型,当然,如果你非要传递这样一个实参:p所指向的字符为普通的非const类型,也不违法。

 

但是,绝大多数与字符串处理有关的函数中,都要求传递给cosnt char *类型的指针指向的是一个以NULL结束的字符串(字符数组)(的首元素)。

因为这些函数的执行过程是:从实参指向的字符开始,一直向后搜索,直到遇到nul字符结束。如果传递一个非NULL结尾的指针(比如一个非NULL结束的字符数组名,或一个字符指针变量(相当于指向只有一个元素的字符数组)),那么函数执行到数组的最后一个元素后,由于没有遇到NULL,会越界执行,直到遇到内存中某处null结束符为止。越界后,内存中的存储内容将无法预料,程序的执行结果也将无法预料。

 

除了cosnt char *类型的参数,还有char *类型的参数。

例如:char *strcpy( char *strDestination, const char *strSource);MSDN中对参数strDestination的解释为Destination string(目标字符串),没有要求Null-terminated,因此,我们可以定义一个字符数组 char str[80]

#include <string.h>#include <stdio.h>void main( void ){   char string[80];   strcpy( string, "Hello world from " );   strcat( string, "strcpy " );   strcat( string, "and " );   strcat( string, "strcat!" );   printf( "String = %s\n", string );}

字符数组未初始化,其中各元素的值都是无法预料的。但是strcpy将字符串“Hello world from”的值复制到数组中后,数组中前面几个元素的值为Hello world from \0,后面的元素仍是无法预料的。

而在strcat中,

char *strcat( char *strDestination, const char *strSource);

参数strDestination的类型为char *,但其在MSDN中的解释为Null-terminated destination string。

 

总结:(1)当参数类型要求为cosnt char *,并且要求为NULL-terminated(通常都会如此要求)时,传递一个字符指针,该指针指向一个null结束的字符数组。(一般用一个字符数组名或字符串常量).

          (2)当参数类型要求为char *时,看看有没有要求NULL-terminated.或者从实际情况考虑,该参数到底该如何传递。如果没有NULL_terminated的要求,而且是用来接收字符串的,定义一个足够大的字符数组,并把数组名传递给它就可以了,否则如(1)所述传递指针。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击