C语言基础-04-字符串和处理函数

1、字符串简介

* 在Java中,一个字符串能够用String类型来存储html

String s = "MJ";

C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,因此在C语言中,咱们能够用字符数组来存储字符串ios

字符串能够看作是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志'\0'。'\0'是一个ASCII码值为0的字符,是一个空操做符,表示什么也不干。因此采用字符数组存放字符串,赋值时应包含结束标志'\0'。数组

* 字符串"mj"的存储状况以下(假设用字符数组char a[]来存储):函数

注意了,尾部有个'\0',若是没有这个结束标记,说明这个字符数组存储的并非字符串spa

2、字符串的初始化

char a[3] = {'m', 'j', '\0'};

char b[3];
b[0] = 'm';
b[1] = 'j';
b[2] = '\0';

char c[3] = "mj";

char d[] = "mj";

char e[20] = "mj";

当咱们使用相似第8行的初始化方式时,系统会自动在字符串尾部加上一个\0结束符code

3、字符串的输出

咱们可使用stdio.h中两个函数来输出字符串,分别是printf和puts函数orm

1.printf函数

* 这个函数咱们已经用过不少遍了,用格式符%s表示须要输出一个字符串htm

char a[3] = {'m', 'j', '\0'};
printf("%s", a);

输出结果:,最后面那个\0是不可能输出的,它只是个空字符,只是字符串结束的标记。blog

* 说到这里,有人可能会想:这样看来,彷佛把最后的\0去掉也没什么影响吧,输出结果应该仍是同样的啊,都是"mj"。内存

咱们能够试一下,把最后面的\0去掉,再进行输出:

char a[3] = {'m', 'j'};
printf("%s", a);

输出结果:,跟上面添加了\0的输出结果是同样的。

别高兴地太早了,我只能说你这是侥幸同样的,运气好了一点。

* 咱们再来看一个例子

char a[3] = {'m', 'j', '\0'}; // 添加告终束符\0

char b[] = {'i', 's'}; // 假设忘记添加结束符\0

printf("字符串a:%s", a); // 输出字符串a

printf("\n"); // 换行

printf("字符串b:%s", b); // 输出字符串b


看清楚了,第3行的字符数组b后面没有添加结束符\0,所以b不算是个正宗的字符串。

按照你的猜测,字符串b的输出应该就是"is",可是输出结果为:,能够看出,当咱们尝试输出b的时候,把a也输出了。

要搞清楚为何,首先要看看a和b的内存地址:

printf("a的地址:%x", a);
printf("\n");
printf("b的地址:%x", b);


输出结果:,由这个数据咱们能够分析出a和b的内存存储状况以下:

能够看出来,数组b和a的内存地址是连续的。咱们再回到输出b的代码:

printf("字符串b:%s", b); // 输出字符串b

%s表示指望输出一个字符串,所以printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,由于\0是字符串的结束标记。

因此,若是想要建立一个字符串,记得加上结束符\0,否则后果很严重,会访问到一些垃圾数据。

2.puts函数

1 char a[] = "mj";2 puts(a);3 4 puts("lmj");

看第2行代码,puts函数会从a的首地址开始输出字符,一直到\0字符为止。

输出结果:,能够看puts函数输出一个字符串后会自动换行

* puts函数一次只能输出一个字符串,printf函数则能够同时输出多个字符串

printf("%s - %s", "mj", "lmj");

 

 4、字符串的输入

stdio.h中有2个函数能够用来接收用户输入的字符串,分别是scanf和gets

1.scanf函数

char a[10];
scanf("%s", a);

scanf函数会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0

注意,不要写成scanf("%s", &a),由于a已经表明了数组的地址,不必再加上&这个地址运算符。

 

2.gets函数

char a[10];
gets(a);

gets跟scanf同样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0。

* gets一次只能读取一个字符串,scanf则能够同时读取多个字符串

* gets能够读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab

5、字符串数组

1.字符串数组简介

* 一维字符数组中存放一个字符串,好比一个名字char name[20] = "mj"

* 若是要存储多个字符串,好比一个班全部学生的名字,则须要二维字符数组,char names[15][20]能够存放15个学生的姓名(假设姓名不超过20字符)

* 若是要存储两个班的学生姓名,那么能够用三维字符数组char names[2][15][20]

 

2.字符串数组的初始化

char names[2][10] = { {'J','a','y','\0'}, {'J','i','m','\0'} };char names2[2][10] = { {"Jay"}, {"Jim"} };char names3[2][10] = { "Jay", "Jim" };

能够把字符串数组看做是一维数组,它的元素是字符串。字符串数组names由字符串"Jay"和字符串"Jim"构成。

6、字符串处理函数

下面介绍的字符串处理函数都是在string.h头文件中声明的,使用前要包含这个头文件。

1.strlen函数

* 这个函数能够用来测量字符串的字符个数,不包括\0

int size = strlen("mj"); // 长度为2
 
char s1[] = "lmj";
int size1 = strlen(s1); // 长度为3
 
char s2[] = {'m', 'j', '\0', 'l', 'm', 'j', '\0'};
int size2 = strlen(s2); // 长度为2




注:本文转自M了个J的博客。

相关文章
相关标签/搜索