C 字符串

在 C 语言中,字符型数据 char 是以ASCII码的形式存放在存储单元中的,占一个字节;而C语言中没有字符串类型,字符串是存放在字符数组中的,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组;下面的声明和初始化创建了一个 "Hello" 字符串,由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依据数组初始化规则,可以把上面的语句写成以下语句:

char greeting[] = "Hello";

以下是 C/C++ 中定义的字符串的内存表示,即一个字符占一个字节,索引从0开始

其实,不需要把 null 字符放在字符串常量的末尾,C 编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾,看下面例子

 

 上面的例子中数组的大小为6,这是因为在数组的默认加了空字符 '\0' 来作为字符串结束的标志;

同时上面的例子也可以看到,指向数组的指针也可以带下标,如上面的 p[i],指针可以带下标的原因是程序编译对下标的处理是转换为地址的,将 p[i]处理成 *(p+i);但是需要注意:只有当p指向数组的第一个元素时,p[i]才表示a[i],也就是说如果当前 p 指向a[3]的话,p[i]代表的是a[3+i]!!

 字符数组的输入输出

字符数组的输入输出有两种方法:

1)单个字符用 %c 输入输出,如上面的例子;

2)将整个字符数组一次输入或输出,用 %s,如下:

 注意:在定义字符数组时,如果不初始化,则需要确定数组的大小,这是因为C不支持定义动态数组;其次,在用scanf 输入字符串时,在数组名前不需要加取址符 &,这是因为数组名本身就是地址!!

 再来看下面的例子:

 

 在第6行输入 how are you 字符串后,str1 str2 str3分别获取到了三个单词,这是因为系统默认把空格字符作为输入的字符串之间的分隔符,所以在第11行输入 how old you 后,str4中只得到了 how 这个单词,并在其后加上了 '\0',可以使用 %[^\n]来进行多个字符的输入,直到出现换行为止,如下:

 

 

 事实上,scanf 提供的 '%[]' 格式串可以用来进行多个字符的输入,并对结束符进行自定义,如%[^EOF]就是直到有EOF 输入,字符串才中止;

 字符串处理函数

C 中有大量操作字符串的函数,它们都包含在 string.h 这个头文件中,需要在使用函数之前将头文件 include 进来:

序号函数 & 目的
1

strcpy(s1, s2);
复制字符串 s2 到字符串 s1

注意:不能使用赋值语句讲一个字符串常量或字符数组直接赋给另一个字符数组,赋值语句只能将一个字符赋给另一个字符,如下:

s1 = "china";

s2 = s1;//非法

s2[0] = s1[0];//合法

strncpy(s1, s2,n);

将字符串 s2 的前 n个字符复制到s1中

2strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾
3strlen(s1);
返回字符串 s1 的实际长度不包括'\0'
4strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0;这里是按ASCII码大小比较
5strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置
6strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置

 下面的实例使用了上述的一些函数:

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值