数据结构的定义是什么(数据结构指的是什么)
1386
2022-05-29
字符数组与字符串
用来存放字符的数组称为字符数组,例如:
char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'a', 'b', 'c', 'd', 'e', 'f','g'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'a', 'b', 'c', 'd', 'e', 'f','g' }; //对全体元素赋值时可以省去长度
字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。
C语言规定,可以将字符串直接赋值给字符数组,例如:
char str[30] = {"1234567890"}; char str[30] = "1234567890"; //这种形式更加简洁,实际开发中常用
数组第0个元素为 ‘1’,第1个元素为 ‘2’,第2个元素为 ‘3’,后面的元素以此类推。也可以不指定数组长度,例如:
char str[] = {"1234567890"}; char str[] = "1234567890"; //这种形式更加简洁,实际开发中常用
在C语言中,字符串总是以’
在C语言中,字符串总是以’\0’作为串的结束符。上面的两个字符串,编译器已经在末尾自动添加了’\0’。
’作为串的结束符。上面的两个字符串,编译器已经在末尾自动添加了’在C语言中,字符串总是以’\0’作为串的结束符。上面的两个字符串,编译器已经在末尾自动添加了’\0’。
’。'
'\0’是ASCII码表中的第0个字符,用NUL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。
’是ASCII码表中的第0个字符,用NUL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。puts 和 printf 在输出字符串时会逐个扫描字符,直到遇见 ‘
puts 和 printf 在输出字符串时会逐个扫描字符,直到遇见 ‘\0’ 才结束输出。
’ 才结束输出。请看下面的例子:
#include #include
运行结果:
str1: 1234567890 str2: 1234567890 str3: 1234567890
str1 和 str2 很好理解,编译器会在字符串最后自动添加 ‘
str1 和 str2 很好理解,编译器会在字符串最后自动添加 ‘\0’,并且数组足够大,所以会输出整个字符串。对于 str3,由于字符串中间存在 ‘\0’,printf() 扫描到这里就认为字符串结束了,所以不会输出后面的内容。
’,并且数组足够大,所以会输出整个字符串。对于 str3,由于字符串中间存在 ‘str1 和 str2 很好理解,编译器会在字符串最后自动添加 ‘\0’,并且数组足够大,所以会输出整个字符串。对于 str3,由于字符串中间存在 ‘\0’,printf() 扫描到这里就认为字符串结束了,所以不会输出后面的内容。
’,printf() 扫描到这里就认为字符串结束了,所以不会输出后面的内容。需要注意的是,用字符串给字符数组赋值时由于要添加结束符 ‘
需要注意的是,用字符串给字符数组赋值时由于要添加结束符 ‘\0’,数组的长度要比字符串的长度(字符串长度不包括 ‘\0’)大1。
’,数组的长度要比字符串的长度(字符串长度不包括 ‘需要注意的是,用字符串给字符数组赋值时由于要添加结束符 ‘\0’,数组的长度要比字符串的长度(字符串长度不包括 ‘\0’)大1。
’)大1。例如:
char str[] = "C program";
该数组在内存中的实际存放情况为:字符串长度为 9,数组长度为 10。
C语言字符串处理函数
C语言提供了丰富的字符串处理函数,例如:字符串的输入、输出、合并、修改、比较、转换、复制、搜索等,使用这些现成的函数可大大减轻编程的负担。
用于输入输出的字符串函数,例如printf、puts、scanf、gets等,使用时应包含头文件stdio.h,使用其它字符串函数则应包含头文件string.h。
字符串长度函数strlen
strlen 是 string length 的缩写,用来获得字符串的长度。所谓长度,就是包含多少个字符(不包括字符串结束标志 ‘
strlen 是 string length 的缩写,用来获得字符串的长度。所谓长度,就是包含多少个字符(不包括字符串结束标志 ‘\0’)。
’)。语法格式为:
strlen(arrayName); strlen 将返回字符串的长度,它是一个整数。 请看下面的例子: #include strlen(arrayName); strlen 将返回字符串的长度,它是一个整数。 请看下面的例子: #include
将上面代码中的 str 改为:
char str[]="C
char str[]="C \0language";
language";那么输出结果就是:
The lenth of the string is 2
字符串连接函数 strcat。
strcat是 string catenate 的缩写,意思是把两个字符串拼接在一起,语法格式为:
strcat(arrayName1, arrayName2);
arrayName1、arrayName2 为需要拼接的字符串。
strcat 将把 arrayName2 连接到 arrayName1 后面,并删去 arrayName1 最后的结束标志 ‘
strcat 将把 arrayName2 连接到 arrayName1 后面,并删去 arrayName1 最后的结束标志 ‘\0’。这就意味着,arrayName1 的长度要足够,必须能够同时容纳 arrayName1 和 arrayName2,否则会越界。
’。这就意味着,arrayName1 的长度要足够,必须能够同时容纳 arrayName1 和 arrayName2,否则会越界。strcat 返回值为 arrayName1 的首地址。
请看下面的例子:
#include
字符串复制函数strcpy
strcpy 是 string copy 的缩写,意思是字符串复制,语法格式为:
strcpy(arrayName1, arrayName2);
strcpy 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志 ‘
strcpy 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志 ‘\0’ 也一同拷贝。
’ 也一同拷贝。请看下面的例子: #include
strcat 要求 arrayName1 要有足够的长度,否则不能全部装入所拷贝的字符串。
字符串比较函数strcmp
strcmp 是 string compare 的缩写,意思是字符串比较,语法格式为:strcmp(arrayName1, arrayName2);
arrayName1 和 arrayName2 是需要比较的两个字符串。
字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。
返回值:若 arrayName1 和 arrayName2 相同,则返回0;若 arrayName1 大于 arrayName2,则返回大于 0 的值;若 arrayName1 小于 arrayName2,则返回小于0 的值。
示例:对4组字符串进行比较
#include
C语言字符串的输入输出
字符串的输出
在C语言中,输出字符串的函数有两个:
int puts(const char *s); int printf(const char *format, ...);
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。
实例:
#include
在printf() 函数中使用%s输出字符串时,在变量列表中给出数组名即可,不能写为printf("%s", str[]);。
字符串的输入
在C语言中,输入字符串的函数有两个:
char *gets(char *s); int scanf(const char *format, ...);
scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
gets():直接输入字符串,并且只能输入字符串。
(1)使用 scanf() 读取字符串
#include
由于字符数组长度为30,因此输入的字符串长度必须小于30,以留出一个字节用于存放字符串结束标志\0。
前面讲scanf 函数时讲到,从键盘上读取数据时,各个变量前面要加取地址符&,用以获得变量的地址。
例如:
int a, b; scanf("%d %d", &a, &b);
但是在本节的示例中,将字符串读入字符数组却没有使用&。
例如:
char str1[20], str2[20], str3[20], str4[20]; scanf("%s %s %s %s",str1, str2, str3, str4);
这是因为C语言规定,数组名就代表了该数组的地址。整个数组是一块连续的内存单元,如有字符数组char c[10].
C语言还规定,数组名所代表的地址为第0个元素的地址,例如char c[10];,c就代表c[0]的地址。第0个元素的地址就是数组的起始地址,称为首地址。也就是说,数组名表示数组的首地址。
C语言数组续-----
设数组c的首地址为0X2000,也即c[0]地址为0X2000,则数组名c就代表这个地址。因为c已经表示地址,所以在c前面不能再加取地址符&,例如写作scanf("%s",&c);是错误的。
有了首地址,有了字符串结束符’\0’,就可以在内存中完整定位一个字符串了。
例如:
printf("%s", c);
printf 函数会根据数组名找到c的首地址,然后逐个输出数组中各个字符直到遇到 ‘\0’ 为止。
int、float、char 类型的变量表示数据本身,数据就保存在变量中;而数组名表示的是数组的首地址,数组保存在其他内存单元,数组名保存的是这块内存的首地址。
(2) 使用 gets() 读取字符串
char *gets(char *s);
gets 是 get string 的缩写,意思是获取用户从键盘输入的字符串。
语法格式为:gets(arrayName);
arrayName 为字符数组。从键盘获得的字符串,将保存在 arrayName 中。
实例:
#include
gets() 函数不会把空格作为输入结束的标志,而只把回车换行作为输入结束的标志,这与 scanf() 函数是不同的。
总结:如果希望读取的字符串中不包含空格,那么使用 scanf() 函数;如果希望获取整行字符串,那么使用 gets() 函数,它能避免空格的截断。
C 语言 数据结构
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。