黑马程序员——C语言基础---字符串

                                                                               ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

一、字符串的基本概念和定义

1、字符串的概念 

字符串是位于双引号中的字符序列。 在内存中以“\0”结束,所占字节比实际多一个 

注意:

1.可以把一个字符常量赋给一个字符变量,但不能把字符串常量赋给字符变量 

2.C语言中没有字符串变量,可以用字符数组来存放字符串

Printf("hello world!");

Char ch[10]="ab"; 

2、字符数组定义 

形式与前面介绍的数值数组相同。  

char 数组名[常量表达式]  

字符数组也可以是二维或多维数组。 

char 数组名[常量表达式1][常量表达式2]   

注意:定义字符数组时,应确保数组长度比字符串长度至少多1 

二、字符数组初始化和引用

1、字符数组初始化 

1) 定义的同时进行初始化 

第一种初始化方法: 

字符数组也允许在定义时作初始化赋值。  

当对全体元素赋初值时也可以省去长度说明。  

第二种初始化方法: 

char c4[10]={"abc"}

//定义了一个字符串数组c4 长度是10,初始化4个字符

'a'->c4[0];

'b'->c4[1];

'c'->c4[2];

'\0'->c4[3];

//c4存储了一个字符串 

第三种初始化方法: 

char c5[5]="ab";

char c6[]="afdsafas";

2) 先定义再初始化:

char c7[3];

c7[0] = 'a';

c7[1] = 'b';

c7[2] = 'c'; 

注意:未被使用的元素均被自动初始化为0  

2、字符数组引用 

字符数组和普通数组一样,也是通过下标引用。

三、以字符串的形式输入和输出  

1、字符数组的输入输出 

使用的格式字符串为“%s”,表示输入、输出的是一个字符串。  

1)字符串的输出 

在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。 

%s 从给定的地址开始,输出字符直到遇到\0结束  

2)字符串的输入     

char ch[10];

scanf("%s",ch);

数组长度为100,因此输入的字符串长度必须小于100,以留出一个字节用于存放字符串结束 标志`\0`。 应该说明的时,对一个字符数组,如果不做初始化赋值,则必须说明数组长度,还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。 

从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段 存放含空格的串。程序可改写如下:  

char st1[6],st2[6],st3[6],st4[6];

printf("input string:");

scanf("%s%s%s%s",st1,st2,st3,st4);

printf("your string: %s %s %s %s\n",st1,st2,st3,st4); 

这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {   
    //1、%s输出字符串
    //保存字符串
    char str[]="asdafasdft";
    printf("%ld\n",sizeof(str));
    //str[0] i
    //str[1] t    
    //%c,我们要查看的是一个字符串,每次打印的事一个字符,这个显然不方便
//    for (int i=0; i<10; i++) {
//        printf("%c",str[i]);
//    }    
    //用%s输出一个字符串
    //从给定的地址开始,一直输出字符,直到遇到\0就停止了
    //str[0]  ----> i
    printf("%s\n",str);
    printf("%s\n",&str[0]);    
    //&str[3] ----> ast
    printf("%s\n",&str[3]);    
    //把一个字符数组,用%s进行输出
    char ch[10]={'a','b','c','d','\0'};
    printf("%s\n",ch);    
    //2、%s接收键盘上输入的一个字符串
    char str3[10]; //
    //从键盘上接收一个字符串,保存在以str为首地址的字符数组中
    scanf("%s",str3);    
    printf("---->%s\n",str3);  //把字符数组,以%s的格式输出    
    //注意点:
    //1、如果以%s格式进行输入的话,注意空格问题
    //如果输入的字符串有空格,则空格之后的字符无法被接收保存
    //(以%s的格式输入,scanf遇到了空格,就结束了)    
    //2、输入的字符串的长度要小于数组的长度
    return 0;
}<span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span></span>

四、字符串结束符使用

1、字符串结束符 

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量 时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束 符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组 的长度来判断字符串的长度了。  

C语言允许用字符串的方式对数组作初始化赋值。  

2、不使用或者不当使用结束符造成的问题  

1)字符数组初始化时没有使用 '\0' 

可写为: 

char c[]={"C program"}; 

或去掉{}写为: 

char c[]="C program"; 

用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定 数组的长度, 而由系统自行处理。 

2)不当的使用 '\0' 

用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。

<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {    
    //定义了一个字符串  abc
    //char str[]="abc";
    //实际上存储了
    // str[0] a
    // str[1] b
    // str[2] c
    // str[3] \0
    //printf("%ld\n",sizeof(str));  // 3  4?    
    //存的是字符,可以以%s输出
    char ch[]={'a','\0','c'};
    char ch1[]={'x','y','z'};
    printf("%s\n",ch1);  //xyz   
    char str2[]="asfasdfa\0sdfasdf";
    printf("%s\n",str2);   
    return 0;
}</span>

五、字符数组和普通数组区别 

实际上,字符数组和普通数组一样,没有本质区别。   

请大家注意数组类型的含义:数据类型指的是数组所包含的元素的类型,而不是数组名的类型, 数组名永远是一个指针,指向第一个元素的地址,即数组首地址 

1)字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。 

2)scanf() 和 printf() 函数有一种格式化字符串 %s 可以用来整体输入输出字符数组,但是没有特定的格式支持 int 数组整体数组输出。 

3)字符数组 ,初始化 char str[]="aab"; 

 整形数组,初始化不能去掉大括号

六、字符串处理函数

C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转 换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。 

用于输入输出的字符串函数,在使用前应包含头文件"stdio.h", 使用其它字符串函数则应包含头文件"string.h"。 

1、字符串输出函数 puts  

格式: puts(字符数组名)  

功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。 

从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由 printf函数取代。当需要按一定格式输出时,通常使用printf函数。 

2、字符串输入函数 gets 

格式: gets (字符数组名)  

功能:从标准输入设备键盘上输入一个字符串。

本函数得到一个函数值,即为该字符数组的首地址。 可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字 符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。 

3、字符串连接函数 strcat  

格式: strcat(字符数组名1,字符数组名2)  

功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志 “\0”。本函数返回值是字符数组1的首地址。 

本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足 够的长度,否则不能全部装入被连接的字符串。

<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {    
    char str[]="abc";
    printf("%s\n",str);    
    //puts(字符数组地址);
    //1)puts函数可以自动换行吗? 可以
    //2)也可以不是数组的首地址,可以是元素的地址
    //3)必须是字符数组
    //4) 不可以格式化输出
    puts(str);    
    char str1[10];
    //使用gets会给出一个警告
    //1)warning: this program uses gets(), which is unsafe.
    //2)不安全:数组长度是100,但是如果你输入了120个字符,存在越界问题
    //3)使用gets可以接收空格
//    gets(str1);
//    puts(str1);   
    //字符串的函数
    //strcat 函数介绍,使用该函数必须要引入头文件
    //1)格式:strcat(oldStr,newStr);
    //2) oldStr的长度要足够到,只要能够保存下oldStr+newStr
    //3) newStr 把oldStr的最后一个字符\0给覆盖了
    char str2[100]="w";
    char str3[]="itcast!";   
    strcat(str2, str3);
    puts(str2);
    puts(str3);   
    printf("%p\n",&str2[1]);
    printf("%p\n",str3);   
    return 0;
}</span><span style="font-size:12px; font-family: SimSun; background-color: rgb(255, 255, 255);"> </span>

4、字符串拷贝函数strcpy  

格式: strcpy(字符数组名1,字符数组名2)  

功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 

本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。  

5、字符串比较函数strcmp 

格式: strcmp(字符数组名1,字符数组名2)  

比较规则:

对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。

如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。

返回值:

(1)字符串1=字符串2,返回0

(2)字符串1>字符串2,返回一个正整数

(3)字符串1<字符串2,返回一个负整数。

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。  

本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果。  

6、测字符串长度函数strlen 

格式: strlen(字符数组名)  

功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值