字符型数组

  字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。
  由于字符数据的应用较广泛,尤其是作为字符串形式使用,有其自己的特点。C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的,

1.字符数组的定义

 
用来存放字符数据的数组是字符数组。在字符数组中的一个元素内存放一个字符。定义字符数组的方法与定义数值型数组的方法类似。例如:

char c[10];
c[0]='Y' c[1]='h'; [2]='d';c[3]='m'; c[4]='a';c[5]='h'; c[6]='s';c[7]='p';c[8]='p';c[9]='y';

以上定义了c为字符数组,包含10个元素。赋值以后数组的状态如下图  

由于字符型数据是以整数形式(ASCI代码)存放的,因此也可以用整型数组来存放字符数据.例如:

int c[10];

c[0]='a';

2.字符数组的初始化

  对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符依次赋给数组的各元素。例如: 


char c[10]={'I',' ','a','m',' ','h',a','p','p','y'};

把10个字符依次赋给c[0]~c[9]这10个元素。
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0') ,例如: 

char c[10]={'c',',p',r',o',g',r','a','m'};

如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如: 
char c[ ]={'I',' ', 'a','m',' ','h','a','p',p',y'}; 
数组c的长度自动定为10。

对字符数组初始化也可以用字符串常量来使字符数组初始化。例如: 
char c[ ]={"I am happy'); 
也可以省略花括号,直接写成
char c[]="I am happy"; 


3.字符数组中元素的引用

可以引用字符数组中的一个元素,得到一个字符。
例题1:输出一个已知的字符串。

#include
int main()
{
	char c[15] = { 'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.' };
	int i;
	for (i = 0; i < 15; i++)
		printf("%c", c[i]);
	printf("\n");
	return 0;
}

运行结果如下:


 

例题2:输出如下的菱形图。

字符型数组_第1张图片

#include 
int main()
{
	char diamond[][5] = { {' ',' ','*'}, {' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'} };
	int i, j;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)

			printf("%c", diamond[i][j]);
		printf("\n");
	}
	return 0;
}

4.字符串和字符串结束的标志

在C语言中,是将字符串作为字符数组来处理的。

C语言规定了一个“字符串结束标志”,以字符’\0‘作为结束标志。如果字符数组中存在若干字符,前面9个字符都不是空字符('\0'),而第10个字符是空字符,则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到字符’\0'时,表示字符串结束,把它前面的字符组成一个字符串。
注意:1.C系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符。例如"C program"共有9个字符。字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节'\0'是由系统自动加上的。

2.‘\0'代表ASCII码为0的字符,从 ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。

3.字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'。是否添加可以根据需要决定。由于系统在处理字符串常量存储时会自动加个'\0',因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中也常常人为地加上一个'\0'。例如: 

char c[6]={'c','h','i','n','a','\0'};

这样做,便于引用字符数组中的字符串。

5.字符数组的输入输出

方法1:逐个字符输入输出。用格式符“%c”输入或输出一个字符。

方法2:将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。例如:

char c[ ]={"China"};

printf("%s\n",c);

注意:scanf函数中的输入项如果是字符数组名,不要再加取地址符“&”,因为在C语言中数组名代表该数组第一个元素的地址。

6.使用字符串处理函数

6.1 puts函数-输出字符串的函数

其一般形式为

puts(字符数组)

其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。用puts函数输出的字符串中也可以包含转义字符。例如:

char str[ ]={"China\nBeijing"};

puts(str);

6.2 gets函数-输入字符串的函数

其一般形式为

gets(字符数组)

其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行以下的函数:

gets(str);//str是已定义的字符数组

如果从键盘上键入"Computer",将输入的字符串送给字符数组(送给数组的共有9个字符,而不是8个),返回的函数值是字符数组str的第一个元素的地址。

6.3 strcat 函数-字符串连接函数

其一般形式为

strcat(字符数组1,字符数组2)

其作用是把两个字符数组中的字符连接起来,把字符串2接到字符串1的后面,结果放在字符数组1的后面,结果放在字符数组1中,函数调用后得到一个函数值-字符数组1的地址。例如:

char str1[30]={"People's Republic of" };

char str2[ ]={”China"}: 
printf{"%s",strcat(str1,str2)};

输出结果: 
People's Republic of China 

(2)连接前两个字符串的后面都有'\0',连接时将字符串1后面的'\0'取消,只在新串最后保留'\0'。

6.4. strcpy和strncpy函数--字符串复制函数

其一般形式为


strcpy(字符数组1,字符串2) 


strcpy是STRingCoPY(字符串复制)的简写。它表示“字符串复制函数”,作用是将字符串2复制到字符数组1中去。例如: 

char str1[10],str2[ ]="China";

strcpy(strl,str2); 


执行后,strl的状态如下: 

C h i n a \0 \0 \0 \0 \0


注意:
(1)字符数组1必须定义得足够大,以便容纳被复制的字符串2。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如 str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。例如:

strcpy(str1,"China");

可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。例如:

strncpy(str1,str2,2); 

作用是将str2中最前面2个字符复制到 str1中,取代 str1中原有的最前面2个字符。但复制的字符个数n不应多于 str1中原有的字符(不包括'\0')。

6.5.strcmp函数--字符串比较函数

其一般形式为

strcmp(字符串1,字符2) 

strcmp是STRing CoMPare(字符串比较)的缩写。它的作用是比较字符串1和字符串2。 例如: 

strcmp(str1, str2); 

strcmp("China","Korea'");

strcmp(str1,"Beijing"); 

字符串比较的规则是:将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。
(1)如全部字符相同,则认为两个字符串相等;
(2)若出现不相同的字符,则以第1对不相同的字符的比较结果为准。例如: 
"A'<"B"                             "a'>"A"                      "computer">"compare"
如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”。例如 computer在字典中的位置在compare之后,所以'computer">"compare"。但应注意小写字母比大写字母“大”,所以"DOG"<"cat"。

比较的结果由函数值带回。

(1)如果字符串1与字符串2相同,则函数值为0。

(2)如果字符串1>字符串2,则函数值为一个正整数。

(3)如果字符串1<字符串2,则函数值为一个负整数。

注意:对两个字符串比较,不能用以下形式: 

if(str1>str2) 
  printf("yes"); 

因为 strl和 str2代表地址而不代表数组中全部元素,而只能用

if(strcmp(strl,str2)>0)

printf("yes"), 

这时,系统分别找到两个字符数组的第一个元素,然后顺序比较数组中各个元素的值。

6.6strlen函数--测字符串长度的函数

其一般形式为

strlen (字符数组) 

strlen是STRing LENgth(字符串长度)的缩写。它是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括'\0'在内)。例如: 

char str[10]="China"; 
printf("%d",strlen(str)); 

输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,例如: 

strlen("China"); 

6.7.strlwr函数--转换为小写的函数

其一般形式为

strIwr(字符串) 

strlwr是STRing LoWeRcase (字符串小写)的缩写。函数的作用是将字符串中大写字母换
成小写字母。


6.8.strupr函数--转换为大写的函数

其一般形式为

strupr(字符串) 

strupr是STRing UPpeRcase(字符串大写)的缩写。函数的作用是将字符串中小写字母换成大写字母。

7.字符数组例题

输入一行字符,统计其中有多少单词,单词之间用空格隔开。

#define   _CRT_SECURE_NO_WARNINGS
#include
#include
int main()
{
	char str[80];
	int i, num = 0, word = 0;
	char c;
	gets(str);
	for (i = 0; (c = str[i]) != '\0'; i++)
		if (c == ' ')
			word = 0;//如果是空格字符,使word置0
		else if (word == 0)//如果不是空格字符且word原值为0
		{
			word = 1;
			num++;
		}
	printf("These are %d words in this line.\n", num);
	return 0;
}

你可能感兴趣的:(c语言)