字符串、字符和字节
字符串是一种重要的数据类型,但是C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中。字符串常量很适用于那些程序不会对它们进行修改的字符串。所有其他字符串都必须存储于字符数组或动态分配的内存中。本章描述处理字符串和字符的库函数,以及一组既可以处理字符串也可以处理非字符串数据的相关函数。
9.1 字符串基础
字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。因此,字符串所包含的字符内部不能出现NUL字节。这个限制很少引起问题,因为NUL字节并不存在与它相关联的可打印字符,这也是选它为终止符的原因。NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NUL字节。
头文件string.h包含了使用字符串函数所需的原型和声明。尽管并非必需,但在程序中包含这个头文件确实是个好主意,因为有了它所包含的原型,编译器可以更好地为程序执行错误检查。
老的C程序常常不包含这个文件,因此没有函数原型,只有每个函数的返回类型才能被声明,而且这些函数中的绝大多数都会忽略返回值。
#include
#include
#include
int main( void ){
const char *cp = "hello, world!";
printf( "cp = %p, "hello, world" = %p,n"
"sizeof(cp) = %zd, sizeof("hello, world!") = %zd,n"
"cp = %s, "hello, world!" = %s,n"
"*cp = *c, *"hello, world!" = %cn",
cp, "hello, world", sizeof(cp), sizeof("hello, world!"), cp, "hello, world", *cp, *"hello, world!" );
char str[] = "hello, world!";
char *dp;
int str_len;
str_len = strlen( "hello, world!" );
dp = (char *)malloc( str_len + 1 );
strcpy( dp, "hello, world!" );
printf( "str = %s, dp = %s, cp = %sn", str, dp, cp );
printf( "strlen("hello, world!") = %d, sizeof("hello, world!") = %zdn", str_len, sizeof("hello, world!") );
free( dp );
printf( "NUL = %d, NUL = %cn", ' ', ' ' );
return EXIT_SUCCESS;
}



