【C语言】09-字符串

一、字符串简介

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

版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。

时间: 2024-08-10 10:27:56

【C语言】09-字符串的相关文章

C语言里字符串的解析

原文网摘:http://www.cnblogs.com/yi-meng/p/3620244.html#undefined 根据给定的字符串,按照一定规则解析字符串,卡住好几次,这次做个笔记,以供参考 函数名称:   strtok 函数原型:   char *strtok(char *s1, const char *s2) 函数功能:   分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词) 函数返回:   字符串s1中首次出现s2中的字符前的子字符串指针 参数说明:   s

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

C语言中字符串如何转换为二进制、八进制、十进制、十六进制

在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, strtod, strtoul表头文件: #include <stdlib.h>定义函数: long int strtol(const char *nptr, char **endptr, int base):函数的解释说明 这个函数会将参数nptr字符串根据参数base来转换成长整型数.参数base

iOS开发入门 ? C语言(字符串、字符串数组、命令行参数)

字符串 1. 概念 用双引号引起来的就是字符串 "a string" //C语言编译器会将两个并列的字符串自动拼接成一个字符串 "a string""another a string" // \是换行连接的标记(一行不够写) "a looooooooooong \ string" 常见ASCII编码: 'A' == 65    'a' == 97    '0' == 48    '\0' == 0 int a[10]; //表

C语言之字符串处理函数

C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数——输出字符串的函数 一般的形式为puts(字符串组) 作用:将一个字符串输出到终端.如,char一个string,并赋予初值.调用puts(string);进行字符串的输出. 2.gets函数——输入字符串的函数 一般的形式:gets(字符数组) 作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址. ge

D语言中字符串的操作

字符串的操作在软件开发中是特别重要的一个事情,因为基本上的编程都会使用到字符串,字符串操作的好坏决定着一个语言的好与差.在我做过的一个项目中曾经就出现过字符串操作性能问题. D语言字符串有 string,wstring,dstring三种类型,在D语言中字符串是使用字符数组定义的,三种类型分别对应char,wchar,dchar.char只有一个字节,wchar为双字节,dchar为三字节.对字符串的操作也相当于是对数组的操作,这跟其它语言不一样,C++中字符串是以string类来进行封装,它的

C语言学习 —— 字符串的学习(一)

这是本人在学习 C语言有关 字符串内容 时的相关笔记 由于本人技术有限,如有错误,还望指正 C语言中数据类型中只有 字符型(char),而 char型 变量一次只能存储一个字符,在日常工作中经常需要定义 字符串 ,所以使用 字符数组 来存储和调用字符数据. 1.字符数组的定义和使用 char ch[50];//定义一个长度为50的字符串数组 定义字符串时需要定义字符串的长度,但是如果在定义的同时对字符串进行赋值 则不需要定义长度,代码如下 char ch[] = "I love QIAN&quo

c语言常见字符串函数经典实现

最近把一些常见的c语言的字符串库函数参照着网上的程序自己实现了一下,也是方便自己复习总结,里面的实现比较经典,下面的函数在我电脑vs2005上都能通过,但未进行严格的测试.点击展开目录,可以直接达到感兴趣的函数实现. /************************************************************************/ /* 1.strcpy函数实现 2.strncpy实现 3.strcat函数实现 4.strncat函数实现 5.strdup实现

C语言之字符串

由于C语言里面没有字符串,所以要输入和输出字符串,就用数组代替了 也可以用 gets void String_003() { char str[50]; gets(str); printf("%s",str); } 记得,在字符串的后面要加一个 /0  否则,可能会加入一些其他的数组 C语言之字符串

C#正则表达式基础 + [0-9]+ 字符串中出现一次或者多次数字

1 代码 1 + [0-9]+ 字符串中出现一次或者多次数字 2 3 4 using System; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Net; 8 using System.Text; 9 using System.Text.RegularExpressions; 10 using System.Threading.Tasks; 11 12 namespace ConsoleAppli