字符数组
定义
- 用来存放字符数据的数组。字符数组中的一个元素存放一个字符。
一般形式
char c [10];
字符数组也可以是二维或多维数组
- 例如:
char c[5][10];
即为二维字符数组。
- 例如:
字符数组初始化
逐个字符赋给数组中各元素。
- 例如:
char c[10]={'A','b',' ','2',' ','h','a','b','c','d'};
- 例如:
- 如果花括号中提供的初值个数大于数组长度,则语法错误;
- 如果初值个数小于数组长度只将这符赋给数组中前面那些元素,其余为'\0';
如果初值个数与预定的数组长度相同,在定义时可以省略各数组长度,系统会自动根据初值个数确定数组长度。
- 例如:
char c[]={'A','b',' ','2',' ','h','a','b','c','d'};
- 例如:
例子
输出一个字符串。
#include <stdio.h>
void main()
{
char c[15] = { 'M','y',' ','n','a','m','e',' ','i','s',' ','X','G','G','M'};
for (int i = 0; i < 15; i++)
printf("%c", c[i]);
printf(" \n");
}
字符串和字符串结束标志
- 在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
有时,人们关心的是有效字符串的长度而不是字符数组的长度。
- 例如,定义一个字符数组长度为100,而实际有效字符只有40个。
为了测定字符串的实际长度,C语言规定了一个“字符串生束标志”,以字符'\0'代表。 - 如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。
也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
- 例如,定义一个字符数组长度为100,而实际有效字符只有40个。
可以把一个字符串直接赋给一个字符数组所表示的变量,以初始化字符数组。
- 例如:
char c[]={"l am happy"};
- 也可以省略花括弧,直接写成
char c[]=“l am happy";
- 例如:
- 用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。
注意:这里不用单个字符作为初值。而是用一个字符串作为初值。数组c的长度不是10,而是11,因为字符串常量的最后由系统加上一个'\0'。
因此,初始化 char c[]="I am happy";
与 char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
等价。
char c[10]={"China"};
字符数组的输入输出
- 逐个字符输入输出。用格式符 “%c” 输入或输出一个字符。
- 将整个字符串一次输入或输出。用符 “%s” 输入或输出一个字符串。
注意:
- 用%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名,或&c。
- 如果数组长度大于字符串实际长度,也只输出到 '\0' 结束。
- 输出字符不包括结束符 '\0' 。
- 如果一个字符数组中包含一个以上 '\0',则遇到第一个 '\0' 时输出就结束。
- 可以用scanf函数输入一个字符串。例如:
char c[20]; scanf("%s",c);
如果利用一个scanf函数输入多个字符串,则以空格分隔。
- 例如:
#include <stdio.h>
#pragma warning(disable:4996)
void main()
{
char str1[5], str2[5], str3[5];
scanf("%s%s%s", str1, str2, str3);
printf("%s %s %s\n", str1, str2, str3);
}
数组首地址
- 在前面介绍过,scanf的各输入项必须以地址方式出现,如&a, &b等。
但在前例中却是以数组名方式出现的,这是为什么呢? - 这是由于在C语言中规定,数组名就代表了数组的首地址。
整个数组是以首地址开头的一个连续的内存单元。
字符串处理函数
- C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。
使用这些函数可大大减轻编程的负担
- 用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”。
- 使用其它字符串函数则应包含头文件“string. h”。
puts(str)
- 作用:将一个字符串(以‘\0结束的字符序列)输出到终端,并且自动换行。
- 例如:
#include <stdio.h>
#include <string.h>
void main()
{
char str[] = { "China\nBeijin" };
puts(str);
}
gets(str)
- 作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。
- 例如:
#include <stdio.h>
#include <string.h>
void main()
{
char str[10];
gets(str);
puts(str);
}
- 注意:用gets和puts函数只能输入或输出一个字符串
不能写成:puts (str1, str2);
或gets(str1, str2);
- 当输入的字符串中含有空格时,输出仍为全部字符串。
说明函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。
strcat()
- 作用:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志"\0",结果放在字符数组1中。
- 本函数返回值是字符数组1的首地址。
- 一般形式:
strcat(字符数组名1,字符数组名2);
- 要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
- 例如:
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
void main()
{
char str1[10],str2[5];
printf("输入数组1的值:\n");
gets(str1);
printf("输入数组2的值:\n");
gets(str2);
strcat(str1, str2);
puts(str1);
}
strcpy()
- 作用:把字符数组2中的字符串拷贝到字符数组1中。
字符串结束标志 "\0" 也一同拷贝。字符数组2也可以是一个字符串常量。 - 这时相当于把一个字符串赋予一个字符数组。
- 一般形式:
strcpy(字符数组名1,字符数组名2);
- 可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。
- 例如:
strncpy( str1,str2,2);
拷贝str2的前两个字符和'\O'。 - 要注意的是字符数组1的值会被覆盖,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
str1="China" ; str1=str2;
是错误的,把字符串赋给某个字符数组,只能用strcpy函数。- 例如:
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
void main()
{
char str1[10], str2[]="China";
strcpy(str1, str2);
puts(str1);
}
strcmp()
作用:按照ASCII码从左向右逐个比较两个数组中的字符,直到出现不同字符或 '\0',并由函数返回值返回比较结果。
- 字符串1 = 字符串2,返回值 = 0;
- 字符串1 > 字符串2,返回值 > 0;
- 字符串1 < 字付串2,返回值 < 0;
- 一般形式:
strcmp(字符数组名1,字符数组名2);
注意:对两个字符串比较,不能以下形式:
if(str1>str2) printf("yes");
- 而只能用
if(strcmp(str1,str2)>O) printf("str1>str2");
- 例如:
#include <stdio.h>
#include <string.h>
void main()
{
int a;
char str1[10], str2[]="China";
gets(str1);
a = strcmp(str1, str2);
if (a == 0) printf("str1 = str2\n");
if (a > 0) printf("str1 > str2\n");
if (a < 0) printf("str1 < str2\n");
}
strlen()
- 作用:测字符串的实际长度(不含字符串结束标志“10')并作为函数返回值。
- 一般形式:
strlen(字符数组名);
- 例如:
#include <stdio.h>
#include <string.h>
void main()
{
int a;
char str[] = "China";
a = strlen(str);
printf("字符串的长度是 %d\n", a);
}
strlwr()
- 格式:
strlwr(字符串);
- 作用:将字符串中大写字母换成小写字母。
strupr()
- 格式:
strupr 宁等串);
- 作用:将字符串中小写字母换成大写字母。
例子
输入一串字符,统计数字的个数。
#include <stdio.h>
#include <string.h>
void main()
{
char str[10],c;
int i, num=0;
gets(str);
for (i = 0; (c = str[i]) != '\0'; i++)
if (c >= '0'&&c <= '9')
num++;
printf("%d\n", num);
}
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
#include <string.h>
void main()
{
int i,word=0,num=0;
char c,str[80];
gets(str);
printf("i\t,str[i]\t,word\t,num\n");
for (i = 0; (c = str[i]) != '\0'; i++) {
if (c == ' ') word=0;
else if (word == 0) {
word = 1;
num++;
}
printf("%d\t,%c\t,%d\t,%d\n", i, str[i], word, num);
}
printf("单词的个数是 %d\n", num);
}
评论