C语言——字符串学习笔记(1)

种一棵树最好的时间是十年前,其次是现在 !

之前学习过数组,相信你已经耳闻过字符数组这一词了吧!下面我们来学习了解一下C语言的字符串常量(C语言中称为字符串字面量)和字符变量。

一、字符串字面量

1.字符串字面量中的转义序列

字符串字面量也可以包含转义序列(\n等等转义序列)。注意:十六进制和八进制数的转义序列较为复杂,要小心使用!

例如:

"hello\nworld\n"

输出就是:hello

                  world

2.延续字符串变量

有时候字符串字面量太长而不能单独放一行,通常就会在最后放一个 \ 结尾,那么C语言就可以在下一行继续输入。但是这样缩进效果就看着不明显了,例子如下:

#include<stdio.h>
int main(void)
{
	printf("ABCDE\
	FGHI\n");
	
	printf("abcde\
fghi\n");
	printf("123"
	"456\n");
}

可以看到,使用 \ 时如果想要把字符串连续在一块输出就没有办法保证缩进格式,所以有一种办法来延续字符串字面量,即"..." "..."两个连起来就可以合并为同一条字符串。

3.储存字符串字面量:

本质上来说,C语言是把字符串字面量当做字符数组来处理的。(但是字符数组不是字符串!字符串最后会有一个\0!)

当C语言中出现长度为n的字符串字面量时,C语言就会为它分配一个长度为 n+1 的空间! 这块内存是用来储存字符串字面量中的字符,而多出来的一个空间是用来标志字符串末尾的额外字符(空字符)这个\0就是字符串字面量结束的标志,用转义字符\0代替,注意:不是 '0',空字符的码值为0,而零字符的ASCII码为48。

例如:字符串字面量"abc"是作为有4个字符的数组来储存的(a、b、c、\0 )

          字符串字面量" "(字符串字面量可以为空。且单独一个空字符储存 即 \0)

那么我们使用字符串字面量为printf函数传参时是传递了什么呢?既然是当做数组处理了,那么编译器自然就把他看做成char * 类型的指针。

例如:printf("abc");

          当调用printf函数时,会传递"abc"的地址(即指向储存字母a的内存单元的指针)

来看一下下面的代码及其运行结果

#include<stdio.h>

int main()
{
	char *a,*b,c;
	a = "abc";
	b = "";
	c = '0';
	
	printf("a = %s\n",a);	
	printf("b[0] = %d\n",b[0]);
	printf("b = %s\n",b); 
	printf("c = %c\n",c);
	return 0;
}

""空字符串中只有一个元素 \0,它就是整数0,但不是字符常量'0'!!!

4.字符串字面量的操作

刚才我们看到了这样的代码

#include<stdio.h>

int main()
{
	char *a,*b,c;
	a = "abc";
	b = "";
	c = '0';
	
	printf("a = %s\n",a);	
	printf("b[0] = %d\n",b[0]);
	printf("b = %s\n",b); 
	printf("c = %c\n",c);
	return 0;
}

通常,在C语言能使用char *指针的地方可以使用字符串字面量。例如字符串字面量可以出现在赋值符号的右边比如上面的char *a,a = "abc"这个赋值操作是让指针a指向了字符串的第一个字符。

C语言允许对指针取下标,因此我们也可以对字符串字面量取下标。例如 char ch; ch = "abc"[0]。

注意:不要去修改字符串字面量!(字符串字面量位于程序的一个叫做“代码段”的地方,而且是只读的,这里不多说)

二、字符串变量

在某些编程语言中会专门为字符串变量提供一种数据类型,而C语言中我们通常会使用一维数组来存储字符串(但一定要记得保证字符串最后以空字符结尾!!!)

当我们自己编写字符串处理函数时也好考虑好空字符的处理!

#define STR_LEN 10

  ...

char str[STR_LEN + 1];//这里把STR_LEN定义成10强调str最多可以储存10个字符的字符串,然后在str数组的声明中对STR_LEN+1来储存空字符。

当然了,声明长度为STR_LEN + 1 的字符数组并不意味着他总是用于存放长度为STR_LEN 的字符串,字符串的长度取决于空字符的位置,而不是取决于存放字符串的字符数组的长度。STR_LEN +1只是限制了字符串的最大长度。

1.初始化字符串变量

可以在声明的时候进行初始化

char str1[] = "hello world"

由于我们一定要确保数组的长度大于字符串字面量的长度,所以我们可以省略它的长度,这种情况下编译器会自动为它补充一个空字符。

字符串字面量"hello world"复制到数组str1中,然后编译器自动补充空字符,这样就可以看做成一个字符串变量了。

当然还有其他的初始化办法,不过记上面这个就行了,上面这个是最常用的。

2.字符数组与字符指针

char *a = "hello world"
char a[] = "hello world"

这两个看起来是一样的声明,前者是声明了一个指针a,后者声明了一个数组a ,都可以看做是字符串。然而两者是有较大的区别的,我们不能认为上面两者可以互换。

在声明为指针时,我们是不能去修改字符串字面量的。(还记得前面提到的只读区代码段吧)

注意:指针变量一定要初始化后再去使用!

3.puts()、gets()、printf()、scanf()、fgets()函数的使用。

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rds.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值