字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。
由于字符数据的应用较广泛,尤其是作为字符串形式使用,有其自己的特点。C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的,
用来存放字符数据的数组是字符数组。在字符数组中的一个元素内存放一个字符。定义字符数组的方法与定义数值型数组的方法类似。例如:
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';
对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符依次赋给数组的各元素。例如:
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";
可以引用字符数组中的一个元素,得到一个字符。
例题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:输出如下的菱形图。
#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;
}
在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'};
这样做,便于引用字符数组中的字符串。
方法1:逐个字符输入输出。用格式符“%c”输入或输出一个字符。
方法2:将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。例如:
char c[ ]={"China"};
printf("%s\n",c);
注意:scanf函数中的输入项如果是字符数组名,不要再加取地址符“&”,因为在C语言中数组名代表该数组第一个元素的地址。
其一般形式为
puts(字符数组)
其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。用puts函数输出的字符串中也可以包含转义字符。例如:
char str[ ]={"China\nBeijing"};
puts(str);
其一般形式为
gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行以下的函数:
gets(str);//str是已定义的字符数组
如果从键盘上键入"Computer",将输入的字符串送给字符数组(送给数组的共有9个字符,而不是8个),返回的函数值是字符数组str的第一个元素的地址。
其一般形式为
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'。
其一般形式为
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')。
其一般形式为
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"),
这时,系统分别找到两个字符数组的第一个元素,然后顺序比较数组中各个元素的值。
其一般形式为
strlen (字符数组)
strlen是STRing LENgth(字符串长度)的缩写。它是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括'\0'在内)。例如:
char str[10]="China";
printf("%d",strlen(str));
输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,例如:
strlen("China");
其一般形式为
strIwr(字符串)
strlwr是STRing LoWeRcase (字符串小写)的缩写。函数的作用是将字符串中大写字母换
成小写字母。
其一般形式为
strupr(字符串)
strupr是STRing UPpeRcase(字符串大写)的缩写。函数的作用是将字符串中小写字母换成大写字母。
#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;
}