C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串
- 一、字符数组的初始化
- 二、字符串的输入与输出
- 三、字符串处理函数
- 1、字符串输出函数:puts
- 2、字符串输入函数 gets
- 3、字符串连接函数 strcat
- 4、字符串拷贝函数 strcpy
- 5、字符串比较函数 strcmp
- 6、测字符串长度函数 strlen
- 四、字符串的应用举例
一、字符数组的初始化
字符数组也可以在定义时初始化,例如:
char c[10]={'C',' ','p','r','o','g','r','a','m'};
//最后一个元素 c[9] 未赋值,系统自动赋予空字符('\0')
当对全部元素赋值时可以省略长度说明。例如:
char c[]={'C',' ','p','r','o','g','r','a','m'};
//此时,数组 c 的长度为 9。
在 C 语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
C 语言允许用字符串的方式对数组进行初始化赋值。当把一个字符串存入一个数组时,同时把结束符 ‘\0’ 存入数组,并以此作为该字符串是否结束的标志。
用字符串的方式对数组进行初始化,格式如下:
char c[]={"C program"};
//也可以去掉花括号
char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志 ‘\0’ ,‘\0’ 是由 C 编译系统自动加上的。在用字符串对字符数组赋初值时一般无需指定数组的长度。
例如:
#include<stdio.h>
int main()
{
char c1[]="C program.";
char c2[]={"Database"};
printf("%d\n",sizeof(c1)); //数组c1有11个元素
printf("%d\n",sizeof(c2)); //数组c1有9个元素
}
以上程序的运行结果为:
二、字符串的输入与输出
可以使用 printf 函数和 scanf 函数一次性输入输出一个字符数组中的字符串,而不必使用循环语句逐个输入输出每个字符。只需使用 “%s” 格式字符串即可实现。
例如:
#include<stdio.h>
int main()
{
char c1[]="C program.";
char c2[20];
scanf("%s",c2);
printf("%s\n",c1);
printf("%s\n",c2);
}
以上程序的运行结果如下:
说明:
(1)用 scanf 输入字符串时,所输入的字符串的长度必须小于所定义的字符数组的长度,以留出一个字节用于存放字符串结束标志 ‘\0’。
(2)用 scanf 输入字符串时,字符串中不能包含空格,否则将以空格作为字符串的结束符(比如上例中,字符数组 c2 只保存了一个字符 ‘I’)。
(3)使用 printf 函数输出字符串时,使用字符数组的名称,而不能带数组下标。例如:
printf("%s\n",c1);
//不能使用
printf("%s\n",c1[]);
(4)使用 scanf 输入字符串时,不能使用地址符。例如:
scanf("%s",c2);
//不能使用
scanf("%s",&c2);
三、字符串处理函数
C 语言提供了丰富的字符串处理函数。使用这些函数可以实现字符串的输入和输出、字符串的合并、修改、比较、转换、赋值、搜索等。使用输入输出函数,应在程序首部包含头文件 stdio.h,使用其他字符串函数应包含头文件 string.h。
1、字符串输出函数:puts
puts 函数的格式如下:
puts(字符串);
puts 函数完全可以由 printf 函数取代。当需要按一定格式输出时,通常使用 printf 函数。
例如:
#include<stdio.h>
int main()
{
char c1[]="C program.\nVisal Basic.";
char c2[]="My name is Liming.";
puts(c1);
puts("\n");
printf("%s\n",c2);
}
以上程序的运行结果如下:
2、字符串输入函数 gets
gets 函数的格式如下:
gets(字符数组名);
说明:通过该函数从标准输入设备上输入一个字符串。
例如:
#include<stdio.h>
int main()
{
char str[15];
printf("请输入字符串:");
gets(str);
printf("你输入字符串为:");
puts(str);
}
以上程序的运行结果如下:
说明:gets 函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是 gets 函数与 scanf 函数的不同之处。
3、字符串连接函数 strcat
strcat 函数的功能是:把字符串连接到字符数组的后面,并删除字符数组中的字符串结束标志 ‘\0’。格式如下:
strcat(字符数组名, 字符串);
例如:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20]="My name is ";
char str2[10];
printf("请输入你的姓名:");
gets(str2);
printf("%s",strcat(str1,str2));
}
以上程序的运行结果如下:
说明:字符数组 str1 应定义足够的长度,否则不能全部装入被连接的字符串。
4、字符串拷贝函数 strcpy
strcpy 函数的功能是将字符串拷贝到字符数组中。字符串结束标志 ‘\0’ 一并拷贝。格式如下:
strcpy(字符数组名, 字符串);
例如:
#include<stdio.h>
#include<string.h>
int main()
{
char str[20];
strcpy(str,"I am a student.");
puts(str);
}
以上程序的运行结果如下:
说明:只有在定义数组并进行初始化时才能使用赋值的方法把一个字符串赋值给一个字符数组。一旦初始化完毕,就只能使用 strcpy 函数实现把字符串赋值给一个字符数组。
5、字符串比较函数 strcmp
strcmp 函数的功能为:按照 ASCII 码比较两个字符串。比较规则如下:
字符串1 = 字符串2,返回值为 0;
字符串1 > 字符串2,返回值大于 0;
字符串1 < 字符串2,返回值小于 0。
strcmp 函数的格式如下:
strcmp(字符串1, 字符串2);
例如:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[10]="OS";
char str2[10]="DB2";
char str3[15]="C Language";
char str4[10]="OS";
printf("str1与str2比较:%d\n",strcmp(str1,str2));
printf("str1与str3比较:%d\n",strcmp(str1,str3));
printf("str1与str4比较:%d\n",strcmp(str1,str4));
printf("str2与str3比较:%d\n",strcmp(str2,str3));
printf("str2与str4比较:%d\n",strcmp(str2,str4));
printf("str3与str4比较:%d\n",strcmp(str3,str4));
}
以上程序的运行结果如下:
6、测字符串长度函数 strlen
strlen 函数返回字符串的长度(不包含字符串结束符 ‘\0’),格式如下:
strlen(字符串);
例如:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[10]="OS";
char str2[10]="DB2";
printf("str1的长度:%d\n",strlen(str1));
printf("str2的长度:%d\n",strlen(str2));
}
以上程序的运行结果如下:
四、字符串的应用举例
1、用户输入三个字符串,输出最大的一个字符串
程序如下:
#include<stdio.h>
#include<string.h>
int main()
{
char str[3][20],string[20];
int i,j;
for(i=0;i<3;i++){
printf("请输入第%d个字符串:",i+1);
gets(str[i]);
}
strcpy(string, str[0]);
for(j=1;j<3;j++){
if (strcmp(string,str[j])<0){
strcpy(string,str[j]);
}
}
printf("最大的字符串为:%s",string);
}
以上程序的运行结果如下:
2、输入一行字符,统计其中有多少个单词,单词之间用空格隔开。
程序如下:
#include<stdio.h>
#include<string.h>
int main()
{
char str[100];
int i,cnt=0,word=0;
printf("请输入一个字符串:");
gets(str);
for(i=0;i<strlen(str);i++){
if (str[i]==' ') {
word=0;
} else {
if(word==0){
word=1;
cnt++;
}
}
}
printf("一共有%d个单词。",cnt);
}
以上程序的运行结果如下: