C语言基础-04-字符串和处理函数
2016-03-15 00:00
351 查看
摘要: 字符串介绍和字符串函数
C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储字符串。
* 字符串可以看做是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志'\0'。'\0'是一个ASCII码值为0的字符,是一个空操作符,表示什么也不干。所以采用字符数组存放字符串,赋值时应包含结束标志'\0'。
* 字符串"mj"的存储情况如下(假设用字符数组char a[]来存储):
注意了,尾部有个'\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串
当我们使用类似第8行的初始化方式时,系统会自动在字符串尾部加上一个\0结束符
输出结果:
,最后面那个\0是不可能输出的,它只是个空字符,只是字符串结束的标记。
* 说到这里,有人可能会想:这样看来,似乎把最后的\0去掉也没什么影响吧,输出结果应该还是一样的啊,都是"mj"。
我们可以试一下,把最后面的\0去掉,再进行输出:
输出结果:
,跟上面添加了\0的输出结果是一样的。
别高兴地太早了,我只能说你这是侥幸一样的,运气好了一点。
* 我们再来看一个例子
看清楚了,第3行的字符数组b后面没有添加结束符\0,因此b不算是个正宗的字符串。
按照你的猜想,字符串b的输出应该就是"is",但是输出结果为:
,可以看出,当我们尝试输出b的时候,把a也输出了。
要搞清楚为什么,首先要看看a和b的内存地址:
输出结果:
,由这个数据我们可以分析出a和b的内存存储情况如下:
可以看出来,数组b和a的内存地址是连续的。我们再回到输出b的代码:
%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。
所以,如果想要创建一个字符串,记得加上结束符\0,不然后果很严重,会访问到一些垃圾数据。
看第2行代码,puts函数会从a的首地址开始输出字符,一直到\0字符为止。
输出结果:
,可以看出puts函数输出一个字符串后会自动换行。
* puts函数一次只能输出一个字符串,printf函数则可以同时输出多个字符串
scanf函数会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0
注意,不要写成scanf("%s", &a),因为a已经代表了数组的地址,没必要再加上&这个地址运算符。
gets跟scanf一样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0。
* gets一次只能读取一个字符串,scanf则可以同时读取多个字符串
* gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab
* 如果要存储多个字符串,比如一个班所有学生的名字,则需要二维字符数组,char names[15][20]可以存放15个学生的姓名(假设姓名不超过20字符)
* 如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]
可以把字符串数组看作是一维数组,它的元素是字符串。字符串数组names由字符串"Jay"和字符串"Jim"构成。
六、字符串处理函数
下面介绍的字符串处理函数都是在string.h头文件中声明的,使用前要包含这个头文件。
注:本文转自M了个J的博客。
一、字符串简介
* 在Java中,一个字符串可以用String类型来存储String s = "MJ";
C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储字符串。
* 字符串可以看做是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志'\0'。'\0'是一个ASCII码值为0的字符,是一个空操作符,表示什么也不干。所以采用字符数组存放字符串,赋值时应包含结束标志'\0'。
* 字符串"mj"的存储情况如下(假设用字符数组char a[]来存储):
注意了,尾部有个'\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串
二、字符串的初始化
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结束符
三、字符串的输出
我们可以使用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的输出结果是一样的。
别高兴地太早了,我只能说你这是侥幸一样的,运气好了一点。
* 我们再来看一个例子
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");
四、字符串的输入
stdio.h中有2个函数可以用来接收用户输入的字符串,分别是scanf和gets1.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"构成。
六、字符串处理函数
下面介绍的字符串处理函数都是在string.h头文件中声明的,使用前要包含这个头文件。
1.strlen函数
* 这个函数可以用来测量字符串的字符个数,不包括\0int 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的博客。
相关文章推荐
- 数据库链接字符串查询网站
- Linux C函数参考手册(PDF版)
- Flex字符串比较 还有Flex字符串操作
- C# partial关键字说明
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法