【C语言】字符串模块

一、字符串简介

* 在Java中,一个字符串可以用String类型来存储

String s = "MJ";

C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储字符串。

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

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

注意了,尾部有个‘\0‘,如果没有这个结束标记,说明这个字符数组存储的并不是字符串

二、字符串的初始化

 1 char a[3] = {‘m‘, ‘j‘, ‘\0‘};
 2
 3 char b[3];
 4 b[0] = ‘m‘;
 5 b[1] = ‘j‘;
 6 b[2] = ‘\0‘;
 7
 8 char c[3] = "mj";
 9
10 char d[] = "mj";
11
12 char e[20] = "mj";

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

三、字符串的输出

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

1.printf函数

* 这个函数我们已经用过很多遍了,用格式符%s表示需要输出一个字符串

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

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

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

我们可以试一下,把最后面的\0去掉,再进行输出:

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

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

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

* 我们再来看一个例子

1 char a[3] = {‘m‘, ‘j‘, ‘\0‘}; // 添加了结束符\0
2
3 char b[] = {‘i‘, ‘s‘}; // 假设忘记添加结束符\0
4
5 printf("字符串a:%s", a); // 输出字符串a
6
7 printf("\n"); // 换行
8
9 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");

四、字符串的输入

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

五、字符串数组

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"构成。

时间: 2024-10-05 11:16:33

【C语言】字符串模块的相关文章

动手打造自己的跨语言异构模块通信解决方案

目前主流的跨语言异构模块通信方案有很多种,比如: 1.跨语言的RPC调用(Apache Thrift):它是Facebook贡献给Apache基金会的开源项目,旨在构建跨语言平台的通信方案.目前它支持非常多种语言,其中当然包括C/C++和Java.Thrift内置一个语言编译器,可以根据Thrift的语法规范,编译生成指定语言的RPC调用模块,功能也是非常的强大.Thrift的语法规范里面定义了数据类型.数据模块结构,有点类似WebService里面的WSDL文件.通过Thrift,我们就可以实

C语言字符串操作大全

转载自:C语言字符串操作总结大全(超详细) 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c)

C语言字符串处理库函数

http://blog.csdn.net/pipisorry/article/details/36898405 使用C语言字符串处理的库函数,务必包含头文件string.h,即#include <string.h> 1. 比较字符串大小函数   1) 忽略大小写---strcasecmp 函数原型: int strcasecmp (const char *s1, const char *s2); 函数说明: 用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异 2)忽略大小写-stric

C语言字符串函数大全

转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# 函数名: stpcpy 功能: 拷贝一个字符串到另一个 用法: char *stpcpy(char *destin, char *source); 程序例: #include<stdio.h> #include<string.h> int main(void) { char string[10]; char *str1 = "abcdefghi

C语言——字符串长度的计算方法

C语言——字符串长度的计算方法 提示:(1)计算字符串长度时关键是要注意辨认转义字符:(2)一个转义字符总是以反斜杠开始,再加一个其他字符组成.所以,遇到反斜杠时要特别注意!!! 1.不带转义字符的字符串   如:“abc!x=/”,其长度为 7   2.带转义字符的字符串   (1) 字符串“abc\n”:其中的'\n'为转义字符(换行符),计算字符串长度时只能计作一个字符,所以该字符串的长度为4(而不是5)   (2) 字符串“abc\n\\\'\"":其中有4个转义字符:'\n'

转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 作者:jcsu C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    

C语言 字符串和数字转换函数

atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.参数nptr字符串可包含正负号.小数点或E(e)来表示指数部分,如123.456或123e-2.

C语言字符串处理函数

函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) {    char string[10];    char *str1 = "abcdefghi";    stpcpy(string, str1);    printf("%sn&

C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出【转】

本文转载自;http://www.cnblogs.com/easyfrog/archive/2011/12/26/C_strstr_split_string.html C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: 下面的这个例子是实现 字符串以分割串分割输出: 1 #include <stdio.h> 2 #include <strin

OC学习将C语言字符串转换为OC字符串

将C语言字符串转换为OC字符串 1 /** 2 * inputNSString:自定义函数 3 */ 4 #import <Foundation/Foundation.h> 5 /** 6 * 将C语言字符串转换为OC语言字符串 7 * @return OC语言字符串 8 */ 9 NSString *inputNSString(){ 10 char arr[256];//假定数组长度为256 11 char ch; 12 int length=0; 13 //while ((ch=getch