C语言中的字符串

字符串

  1. 字符串

用双引号引起来的多个字符。

在C语言中字符串是用’\0’结束的。即每个字符串的最后一个字符是’\0’,但是结束符不显示,仅仅标志该字符串到这儿就结束了。

二、声明字符串

char *str = “Hello world!\n”;

系统在常量区分配一块存储空间,存储形式是:

pastedGraphic.png

把该字符串在常量区的地址保存到指针变量str中。

可以以%s的形式在屏幕上打印输出字符串,如:

printf(“%s”, str );

需要注意的是:1) str是一个指针变量,该变量在栈结构中,而实际的字符串在内存的常量区。2)该字符串在内存常量区中占用14个字节,因为有一个结束符’\0’。3)在printf()函数中以%s打印输出时,从指针变量str标识的地址开始打印,直到遇到’\0’。4)字符串是一个常量,不能被修改,即 *str = ‘W’; 通过指针变量给这个字符串的第一个字符重新赋值是不正确的。5)声明字符串会返回该字符串在常量区的地址,所以:printf( “%c\n”, ”hello world!\n”);这条语句在执行时,会打印输出字母h。因为取操作后就是这个地址所指向的字符。

三、字符串的常用操作

1. 字符串的修改。

因为字符串在常量区,不能被修改,如果需要修改字符串,需要把字符串复制到栈结构中的数组中,再修改:

char  str2[] = “hello world\n”;

字符数组可以直接按以上形式直接初始化。再次提醒大家,sizeof(str2) 应该返回的值是14,因为需要包括结束标志’\0’.

2.字符串的读取与打印

先定义一个足够大的数组,然后通过scanf()函数以%s的格式输入,如:

char  buff[64]; //定义存储字符串的数组

scanf( “%s”, buff ); //读取

printf(“%s\n”, buff ); //打印

这儿需要说明的是scanf("%s")这种格式在接收字符串时,它不能接收空格、tab键等空白字符,如果需要接收这些空白字符,需要使用gets(str)函数, 用这个函数会弹出不安全警告,因为输入的内容可能会超过数组的长度

 

需要注意:

char  * str;

scanf(" %s" , str );  //??????是否可以读一个字符串,str只是定义了没有初始化,指向哪儿不确定,这就是野指针

3. 通过指针变量保存字符串

char *p1 = "abcdef";

char *p2 = "abcdef";

"abcdef"字符串保存在常量区中,不能被修改,即

*p1 = 'h'; 会出错; 另外,p1变量中保存的地址和p2变量中保存的地址是相同的。都是"abcdef"字符串的首地址。

练习:

char * demo(){

char names[] = "zhangsan";

return names;

}

通过这种方式返回在子函数中定义的局部变量数组names,实际返回的是空。应该把char names[]数组改为指针的形式:

char *names = "zhangsan"; //保存在常量区

四、 字符串的相关函数

字符串的相关函数的声明在头文件string.h中

1. 字符串的复制

strcpy ( char * dest,  const char *source);

dest是一个数组的首地址, source是一个字符串常量的首地址,把source复制到数组dest中,包括最后的结束标志也要复制,该函数返回dest.

字符串在复制时,实际上是

int i = 0;

for (  ;  source[i] != '\0';  i++ ){

dest[i] = source[i];

}

dest[i]='\0';

或写为:

char * x = dest;

while( *dest++ = *sourse++) ;

return x;

2. 字符串的长度

size_t strlen ( const char *)

计算字符串的有效长度,不包括结束标志

size_t是 unsigned long的别名

3. 字符串转数字

int  atoi ( const char *s); //该函数在stdlib.h头文件中

将数字字符串转换为数字,如将“123”转换为123.

4.字符串连接

char * strcat( char * s1, const chsr *s2)

将s2字符串拼接到s1字符串后面

练习:输入三个字符串,并将三个字符串拼接到一起,生成一个新的字符串;

5. 查找子串

char * strstr( const char *s1, const char *s2)

在s1中查找s2,返回首字母的地址,如果找不到,返回NULL。

练习:在一个字符串“adbcdeedededededead",中查找子串“ded"出现的次数。

6. 字符串比较

char * strcmp( const char * s1, const char * s2)

依次比较两个两个字符串的每个字符,返回首个不相等字符的Ascii码的差值。如果s1比s2大,返回正数,否则返回负数,相等返回0

7.字符串分隔函数

char*  strtok( const char *s1, const str *s2);

被分隔的字符串s1,可能在数组中,不是是常量字符串。s2是分隔符

char str[] = "hello world You are good";

char *p = str;

while( 1 ){

p = strtok(p, " " );   // p=strtok(p, " ,.!" ); 

if (p == NULL)

break;

printf("%s\n", p );

p=NULL;

}

 

 

 

作业:

1.自己编写一个函数,实现两个字符串的连接

2.实现字符串的比较函数

3.实现字符串查找函数

4. 将字符串中的单词逆序输出,”you are a man",输出后“man a are you"。

5.输入一行字符串,清除该行字符串中的标点符号。

 

1. char * substr (char * dst, char *src, int start, int end)

从字符串src中取出从start到end的子串,通过dst和返回值返回子串指针,请实现。

2. char * remove( char *src, int start, int len)

从src的start处删除长度为len的字串,返回新串指针,请实现。

3. 输出 “abcdcabcdcefcdcdcg” 中 “cdc”出现的次数

cdccdc算作出现两次

cdcdc算作出现一次

 

posted @ 2016-03-15 21:31  甘林梦  阅读(354)  评论(0编辑  收藏  举报