一、字符串简介

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

 

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

  1. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  2. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  3. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  4. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  5. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

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

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  7. C 语言字符串连接的 3种方式

    C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...

  8. C语言字符串声明

    重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...

  9. C语言字符串操作函数整理

    整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...

  10. CCAN:C语言的模块仓库

    实践中一门编程语言是否有用.好不好,不仅体现在语言本身,更在语言的生态系统:用的人多不多.社区是否活跃互帮互助.语言的相关库和框架质量如何,还有就是已有的模块的质量与数量. CPAN(Comprehe ...

随机推荐

  1. PHP+Mysql+jQuery实现中国地图区域数据统计(raphael.js)

    使用过百度统计或者cnzz统计的童鞋应该知道,后台有一个地图统计,不同访问量的省份显示的颜色也不一样,今天我将带领大家开发一个这样的案例.上一篇<使用raphael.js绘制中国地图>文章 ...

  2. 反射调用方法报InvocationTargetException异常

    利用 Method 对象的 invoke 方法调用目标对象的方法时, 若在目标对象的方法内部抛出异常, 会被包装成 InvocationTargetException 异常抛出,  可以通过调用 In ...

  3. leetcode[159] Longest Substring with At Most Two Distinct Characters

    找到最多含有两个不同字符的子串的最长长度.例如:eoeabc,最长的是eoe为3,其他都为2. 思路: 用p1,p2表示两种字符串的最后一个出现的下标位置.初始p1为0. p2为-1.start初始化 ...

  4. POJ Big Christmas Tree(最短的基础)

    Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...

  5. 【MS SQL】把多个数据库合并为一个新的数据库

    原文:[MS SQL]把多个数据库合并为一个新的数据库 因应工作要求,需要把两个数据库合并成一个库: 一开始使用"导入数据.导出数据和复制数据库"三个工具时,没有达到要的效果. 后 ...

  6. web开发人员

    随笔- 4  文章- 18  评论- 12  [译]作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的   前日在cnblogs上看到一遍文章<每个程序员都必读的12篇文章> ...

  7. OSGi.NET 学习笔记

    OSGi.NET 学习笔记 [目录]   持续更新和调整中,本人学习笔记,非官方文档,难免疏漏,仅供参考. OSGi.NET SDK下载地址. 前言及环境准备 模块化和插件化 概念 实例 小结 面向服 ...

  8. 在线web编辑器

    真正在线编辑的在线web编辑器 最近正在研究开发一款在线web编辑器架构,这是一款真正傻瓜式的web编辑器,可以在正常浏览页面的情况进行编辑,经过测试,对于一般网页页面来说非常好用方便,操作更简单. ...

  9. Mvc的多层架构

    分享一个Mvc的多层架构,欢迎大家拍砖斧正   多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有一句话是比较有代表 ...

  10. Webapi备忘-20140109

    r01的翻译系列:http://www.cnblogs.com/r01cn/category/428069.html 接收FROM数据 Webapi接收表单数据,如果有多个数据比如x=1&y= ...