实验八 字符数组-教师版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八字符数组
8.1实验要求与目的
1. 掌握字符数组的定义、赋值和输入输出的方法;
2. 掌握字符串输入输出格式控制符%s的使用;
3. 掌握字符数组和字符串处理函数的使用;
4. 掌握相关的算法(字符的统计、字符的简单加密、回文字符的判定、字符的逆序存放,字符串的删除、排序等)。
8.2实验指导
字符串常量是由一对双引号括起来的字符序列。
字符串中可包含字母,数字以及任意符号。
如,“CHINA”,“@#12”,“1”等都是合法的字符串常量。
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,而字符串总是以'\0'作为串的结束符。
即,字符串的存储是从首字符开始依次存储在一片连续的存储单元,所占内存大小为字符串实际长度加字符串结束标志'\0' (ASCII码值为0)。
字符串的值是其第一个字符的地址。
即对字符串操作两个关键问题,一是字符串的首地址,另一是字符串的结束标志'\0'。
字符数组的定义和引用方式与数组是相同的。
特别注意的是字符数组的每个数组元素只能存储一个字符。
【8.1】编程实现,用字符串“Cprogram”初始化数组ch,输入字符串“Happy”,存入字符数组str中,并输出这两个字符串。
程序文件名ex8_1.c。
分析:通常情况下,对一个字符串的操作,采用一维字符数组,数组长度至少为字符串的实际长度加字符串的结束标志;对多个(两个或两个以上)字符串操作,采用二维字符数组,二维字符数组的第1个下标为字符串的个数,第2个下标至少为多个字符串中最长字符串的实际长度加字符串的结束标志。
字符数组初始化:
char ch[9]={'C','p','r','o','g','r','a,'m','\0'};
或,char ch[9]="Cprogram";
或,char ch[]="Cprogram";
字符数组的输入和输出与普通数组一样,可用循环语句逐个地输入输出每个字符,如若有定义char str[6];
输入:输出:
for(i=0; i<6; i++) for(i=0; i<6; i++)
scanf("%c", &str[i]); printf("%c",str[i]);
字符串的输入输出通常采用格式控制符%s来实现,如,
scanf("%s",str); /*str是数组名,不要加&地址符*/
printf("%s",str); /*str是数组名,不能写成数组元素*/ 此外,用%s输入字符串遇到空格结束,因此对于含有空格字符的字符串字符可用函数gets()实现字符串的输入,如,gets(str);
同样,也可采用函数puts()实现字符串的输出,如puts(str);。
#include<stdio.h>
void main()
{
char str[6],ch[]="Cprogram";
printf("please input a string:\n");
gets(str); /*字符串输入*/
printf("%s\n%s",ch,str); /*字符串输出*/
}
输入测试数据:Happy
程序运行结果:Cprogram
Happy
小结:
1.字符串输出若采用函数puts时,该函数一次只能输出一个字符串,若要输出多个字符串,就必须用多条puts函数语句。
如程序中用puts函数输出两个字符串,程序修改如下。
#include<stdio.h>
void main()
{
char str[6],ch[]="Cprogram";
printf("please input a string:\n");
gets(str); /*字符串输入*/
puts(ch);
puts(str); /*字符串输出*/
}
2.用puts函数输出时,将字符串结束标志'\0'转换成'\n',即输出字符串后换行。
【8.2】编程实现,将一个字符串按逆序存放。
程序文件名:ex8_2.c。
分析:将任意一个字符串存入字符数组str中,一个字符串按逆序存放的算法是,只需将第一个字符和最后一个字符交换,第二个字符和倒数第二个字符交换……如此循环交换即可实现逆序。
本程序编程的要点:
1.如何确定字符串的长度?字符数组可以定义的长一点,而输入字符串的长度只需小于字符数组的长度即可。
2. 最后一个字符的下标如何确定?可借助求字符串长度函数strlen;或采用循环语句求字符串的长度。
#include<stdio.h>
#include<string.h> /*用到字符串处理函数须添加string.h头文件*/
void main()
{
char str[80],t;
int i,j;
printf("please input a string:\n");
gets(str); /*字符串输入*/
j=strlen(str)-1; /*求字符串最后一个字符的下标*/
for(i=0; i<j; i++, j--) /*借助循环实现逆序存放*/
t=str[j];
str[j]=str[i];
str[i]=t;
}
printf("the inversed string is:\n");
puts(str); /*字符串输出*/
}
输入测试数据:hello c
程序运行结果:c olleh
小结:
1. 在使用字符串函数时,需在本程序包含头文件“string.h”。
程序用到了字符串求长度
函数strlen,须在main函数外部加宏定义#include<string.h>。
strlen函数是求串的实际长度,不包括'\0'。
2. 因为数组下标是从0开始,所以最后一个字符的下标应为strlen(str)-1。
3. 本题设置了两个下标变量i和j;其中,i指向第0个字符,j指向最后一个字符。
通
过i++和j—的移动,分别实现字符的交换,当i==j时,说明i和j指向同一个字符,交换结束。
4. 本题还可以只借助一个下标变量来实现逆序,程序文件名为ex8_21.c,修改程序如
下,
#include<stdio.h>
#include<string.h>
void main()
{
char str[80],t;
int i;
gets(str);
for(i=0;i<(strlen(str))/2; i++ )
{
t=str[i]; /*第i个字符与第strlen(str)-i-1个字符互换*/
str[i]=str[strlen(str)-i-1];
str[strlen(str)-i-1]=t;
}
puts(str);
}
5. 最后一个字符的下标也可采用循环语句求字符串的长度的算法来实现,修改上述程
序。
#include<stdio.h>
void main()
{
char str[80],t;
int i,n=0;
gets(str);
while(str[n]!='\0') /*计算字符串的实际长度*/
n++;
for(i=0;i<n/2; i++ )
t=str[i];
str[i]=str[n-i-1];
str[n-i-1]=t;
}
puts(str);
}
【8.3】编程实现,有一篇文章,共有3行文字,每行最多有80个字符。
要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。
程序文件名:ex8_3.c。
分析:本程序首要问题是如何存储3行文字?可以将3行文字,看成3个字符串,而每个字符串的最大长度不超过80,故应定义一个二维字符数组text[3][80]来处理。
C语言可以把一个二维数组当成多个一维数组处理,因此二维字符数组text[3][80]可看成是由text[0]、text[1]、text[2]为数组名的一维数组,则text[i]表示第i行的起始地址,即是第i个字符串的首地址,而text[i][j]则表示第i个字符串的第j个字符。
因此统计一篇文章的各类字符的个数,可按每行统计,先判断该字符是属于哪类字符,然后分别计数即可。
#include <stdio.h>
void main( )
{
int i,j,upp,low,dig,spa,oth;
char text[3][80]; /*定义二维字符数组来实现*/
upp=low=dig=spa=oth=0;
printf("please input 3 strings:\n");
for(i=0;i<3;i++) /*输入每行不超过80个字符的3行文字*/ gets(text[i]);
for(i=0;i<3;i++) /*外层循环表示有三行字符串*/
for(j=0;j<80&&text[i][j]!='\0';j++) /*内层循环具体判断每一行字符串*/
{
if(text[i]>='A'&& text[i]<='Z') /*统计大写字母个数*/
upp++;
else if(text[i]>='a'&& text[i]<='z') /*统计小写字母个数*/
low++;
else if(text[i]>='0'&& text[i]<='9') /*统计数字字符个数*/
dig++;
else if(text[i]==' ') /*统计空格字符个数*/
spa++;
else
oth++; /*统计其它字符个数*/
}
printf("upper case:%d\n",upp);
printf("lower case:%d\n",low);
printf("digit:%d\n",dig);
printf("space:%d\n",spa);
printf("other:%d\n",oth);
}
输入测试数据:E-Business!
ebXML Standard & Patter!
20160414 C program.
程序运行结果:upper case: 8
lower case: 28
digit: 8
space: 5
other: 5
小结:
1.由于输入的字符串中含有空格,因此不能用格式输入函数scanf,可以用gets函数。
因输入3个字符串,常采用循环语句实现。
如,for(i=0;i<3;i++)
gets(text[i]);
同样,若要输出多个字符串时,也采用循环语句实现。
如,for(i=0;i<3;i++)
puts(text[i]);
或,for(i=0;i<3;i++)
printf("%s\n",text[i]);
2. 内循环循环条件表达式j<80&&text[i][j]!='\0'; ,其含义是字符数组的长度为80,所
以超过字符串长度不再判断,若字符串的长度在80以内,则判断字符串是否结束可以通过判断text[i]是否为'\0'来实现。
3.统计英文大写字母、小写字母等的个数时,只需判断该字符是否在…A‟到…Z‟或‟a‟到‟z‟等的范围内即可,而不需写相应的ASCII码值。
【8.4】编程实现,输入五个任意字符串,求最大字符串。
程序文件名:ex8_4.c。
分析:由题意,可采用二维字符数组来存储5个字符串,字符串的最大长度在没有说明时,也可定义为79个字符或自行设定。
求最大字符串的算法,与求多数的最大值的算法相同。
引用一个一维数组存放最大字符串,算法的核心是比较,赋值。
1. 两个字符串比较大小,一定不能用关系运算符直接进行比较,而需使用字符串比较函数strcmp。
字符串比较函数strcmp的一般格式:
strcmp(字符数组1,字符数组2)
该函数返回的结果决定了两个字符串的大小关系。
字符串比较的规则:按两个字符串自左至右逐个字符以该字符的ASCII码值的大小进行比较,若全部字符相同,则两个字符串相等,若出现第一对不同的字符或遇到\0终止,且以这一对字符的ASCII代码值的大小决定这两个字符串的大小。
因此字符串比较函数返回的值有三类,正整数、零和负整数。
若返回值为正整数,则,strcmp(字符串1,字符串2)>0,其结果是字符串1大于字符串2;
若返回值为零,则,strcmp(字符串1,字符串2)==0,其结果是两个字符串相等;
若返回值为负整数,则,strcmp(字符串1,字符串2)<0,其结果是字符串1小于字符串2;
2.字符串赋值,不能通过赋值运算符“=”实现,而需使用字符串赋值(拷贝)函数strcpy。
字符串赋值函数strcpy的一般格式:
strcpy (字符数组1,字符数组2)
把字符数组2中的字符串,连同串结束标志\0一起赋值到字符数组1中。
该函数返回字符数组1的首地址。
字符数组名2,也可以是一个字符串常量,这时相当于把一个字符串赋给另一字符数组。
#include <stdio.h>
#include <string.h>
#define N 5
void main ( )
{
char str[N][79],max[79];
int j;
for(j=0;j<N;j++)
gets(str[j]);
strcpy(max,str[0]);
for(j=1;j<N;j++)
if(strcmp(max,str[j])<0) /* 两个字符串比较*/
strcpy(max,str[j]); /* 将较大的字符串存于一维数组max*/ printf("最大的字符串:%s\n",max);
}
输入测试数据:suzhou
wuxi
zhengjiang
yangzhou
changzhou
程序运行结果:最大的字符串: zhengjiang
小结:
1. 在使用字符串函数时,需在本程序包含头文件“string.h”。
常用的字符串函数有:字符拷贝函数strcpy、字符串连接函数strcat、字符串比较函数strcmp和字符串求长度函数strlen等。
2.字符串输入函数gets和字符串输出函数puts,在使用时,需在本程序包含头文件“stdio.h”。
8.3实验内容
8.3.1 夯实基础
【8.5】编程实现,有一电文,已按下列规律译成密码:
A→Z,a→z
B→Y ,b→y
C→X ,c→x
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。
非字母字符不变。
编写一个程序将密码译成原文,并输出密码和原文。
程序文件名:ex8_5.c。
输入测试数据:sdf56wvDRE
程序运行结果:cipher text is: sdf56wvDRE
plain text is: hwu56deWIV
【参考源程序】:
#include<stdio.h>
void main()
{
int i;
char ch[60],tp[60];
gets(ch);
printf("\n cipher text is :" );
puts(ch);
i=0;
while(ch[i]!='\0')
{
if((ch[i]>='A')&&(ch[i]<='Z'))
tp[i]= 'A'+'Z'-ch[i];
else if((ch[i]>='a')&&(ch[i]<='z'))
tp[i]= 'a'+'z'-ch[i];
else
tp[i]=ch[i];
i++;
}
tp[i]='\0';
printf(" plain text is :");
puts(tp);
}
小结:
1.引用两个一维数组,一个存储原码(字符数组ch),另一个存放密码(字符数组tp)。
2.采用循环语句实现原码中逐个字符译码,直到原码字符串结束标志为止。
3.当循环退出时存放密码的字符数组tp,需在最后一个字符的后面添加的'\0'。
【8.6】编程实现,将字符串ss中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。
程序文件名:ex8_6.c。
输入测试数据:abc4EFg
程序运行结果:aBc4EFg
【参考源程序】:
#include <stdio.h>
#include <string.h>
void main( )
{
char ss[80] ;
int i ;
printf( "\nPlease enter an string within 80 characters:\n" );
gets( ss );
for(i = 1 ; i < strlen( ss) ; i+=2)
{
if(ss[i] >= 'a' && ss[i] <= 'z')
ss[i] -= 32 ;
}
printf( "\nAfter changing, the string:%s", ss);
}
小结:
由于要统计下标为奇数位置的字母,循环初值为1开始,每次增2
【8.7】编程实现,输入五个字符串,要求按由小到大顺序排列输出。
程序文件名:ex8_7.c。
输入测试数据:program
welcome
meet
chiness
patter
程序运行结果:chiness
meet
patter
program
welcome
【参考源程序】:
#include <stdio.h>
#include<string.h>
void main()
{ char st[20],cs[5][20];
int i,j,p;
printf("input 5 string :\n");
for(i=0;i<5;i++)
gets(cs[i]);
printf("\n");
for(i=0;i<4;i++)
{ for(j=0;j<4-i;j++)
if(strcmp(cs[j], cs[j+1])>0)
{
strcpy(st,cs[j]);
strcpy(cs[j],cs[j+1]);
strcpy(cs[j+1],st);
}
}
for(i=0;i<5;i++)
puts(cs[i]);
printf("\n");
}
小结:
五个字符串同样由一个二维字符数组来处理。
同样将一个二维数组当成多个一维数组处理。
每个一维数组就是一个字符串,由于需要从小到大排列而不仅是求最大串,所以要采用相应排序算法。
【8.8】编程实现,先将字符串s中的字符按逆序存放到t串中,然后把s中的字符按正序连接到t串的后面(不能采用字符串处理函数)。
程序文件名:ex8_8.c。
输入测试数据:ABCDE
程序运行结果:EDCBAABCDE
【参考源程序】:
#include <stdio.h>
#include <string.h>
#define N 40
void main()
{
char s[N], t[2*N];
int n, i;
printf("\n请输入长度<%d的字符串:\n",N);
gets(s);
n = strlen(s);
for (i=0; i<n;i++) /*将原字符串逆序存入数组t中*/
t[i] = s[n-i-1];
for (i=0; i<n;i++) /*将原字符串连接到数组t后*/
t[n+i] = s[i];
t[n*2] = '\0'; /*为新生成的字符串末尾加'\0'*/
printf("The result is: %s\n", t);
}
小结:
不用字符串连接函数strcat()也可以实现两个串的连接,借助循环依次将s串中的字符接入t串,最后要为新生成的串末尾加上'\0'。
【8.9】程序填空:从键盘输入由5个字符组成的单词,判断此单词是不是hello,并显示结果。
请填空。
填空时不得增行或删行,也不得更改程序的结构,一条横线上只能填写一条语句!程序文件名:ex8_9.c。
第一次运行程序
输入测试数据:hello
程序运行结果:this word is hello
第二次运行程序
输入测试数据:helop
程序运行结果:this word is not hello
#include<stdio.h>
void main()
{
char str[ ]={'h','e','l','l','o'};
char str1[5];
【1】;
for(i=0;i<5;i++)
【2】; /*对字符数组str1 输入*/
flag=0;
for(i=0;i<5;i++)
if (【3】){flag=1; break;}
if ( 【4】) printf("this word is not hello"); /*通过flag来判断单词是否相同*/
else printf("this word is hello");
}
参考答案:
【1】int i,flag
【2】str1[i]=getchar( )
【3】str1[i]!=str[i]
【4】flag 或flag!=1或flag==0
【8.10】程序填空:以下程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。
请填空。
填空时不得增行或删行,也不得更改程序的结构,一条横线上只能填写一条语句!程序文件名:ex8_10.c。
程序运行结果:alancuegg
#include <stdio.h>
#include <string.h>
void main()
{
char a[]="clanguage",t;
int i, j, k;
k= 【1】;
for(i=0; i<=k-2; i+=2) /*将偶数下标元素排列,增量为2*/ for(j=i+2; j<=k; 【2】)
if( 【3】)
{ t=a[i]; a[i]=a[j]; a[j]=t; }
puts(a);
}
参考答案:
【1】strlen(a)
【2】j+=2
【3】a[i]>a[j]
小结:
本题是将字符数组a中下标值为偶数的元素排序,在排序算法中只需将循环增量改为每次增2。
【8.11】程序填空:程序的功能是计算一个字符串中子串出现的次数。
请填空。
填空时不得增行或删行,也不得更改程序的结构,一条横线上只能填写一条语句!程序文件名:ex8_11.c。
输入测试数据:abccabccab
ab
程序运行结果:chuxian cishu=3
#include<stdio.h>
void main()
{
int i ,j, k,count;
char s[20],t[20];
printf("zhu chuan:");
gets(s);
printf("zi chuan:");
gets(t);
【1】;
for(i=0;s[i];i++) /*外层循环遍历s串*/
for(j=i,k=0; 【2】&&s[j]==t[k];j++,k++) /*内层循环判断s中是否有
与t相同的子串*/
if ( 【3】) /*如果t[k+1]=='\0'说明找到了一个子串*/
count++;
printf("chuxian cishu=%d\n",count);
}
参考答案:
【1】count=0
【2】t[k]或t[k]!='\0'
【3】!t[k+1] 或t[k+1]=='\0'
小结: t和s 是给定的两个串,在主串s 中找到等于子串t的过程称为模式匹配,如果在s 中找到等于t的子串,则称匹配成功。
算法思想如下:首先将s0与t0进行比较,若不同,就将s1与t0进行比较……,直到s的某一个字符s i和t0相同;再将它们之后的字符进行比较,若也相同,则如此继续往下比较。
当s的某一个字符s i与t的字符t j不同时,则s返回到本趟开始字符的下一个字符,即s i-j+1,t返回到t0,继续开始下一趟的比较。
如此往复进行上述过程,若t中的字符全部比较完,则说明本趟匹配成功;否则,匹配失败。
【8.12】程序改错:下列程序的功能是,判断一个字符串是否为回文字符串。
所谓回文字符串是指一个字符串正读和倒读都是同一个字符串,如,level就是回文字符串。
程序文件名为ex8_12.c。
根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
题中用“/******found******/”来提示在下一行有错。
改错时,可以修改语句中的一部分内容,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
第一次运行程序
输入测试数据: asdfg
程序运行结果: asdfg bushi hui wen chuan
第二次运行程序
输入测试数据:abccba
程序运行结果:abccba shi hui wen chuan
【含有错误的源程序】:
#include <stdio.h>
#include<string.h>
void main()
{
char a[79];
int p=1,left,right;
printf("please input a string:\n");
/******found******/
gets(a[79]); //gets(a);
left=0;
/******found******/
right=strlen(a); //right=strlen(a)-1;
while(left<=right)
/******found******/
if(a[left]!=a[right]); //if(a[left++]!=a[right--]);
p=0;
if(p)
printf("%s shi hui wen chuan\n",a);
else
printf("%s bushi hui wen chuan\n",a);
}
小结:回文的判断与字符串的逆序类似,本题设置了两个下标变量left和right;其中,left 指向第0个字符,right指向最后一个字符。
通过left++和right—的移动来判断字符是否相等。
【8.13】程序改错:下列程序的功能是,将字符串s中ASCII值为偶数的字符删除,原串中剩余字符形成一个新串放在字符串t中。
程序文件名:ex8_13.c。
输入测试数据:dfgthikj
程序运行结果:gik
根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
题中用“/******found******/”来提示在下一行有错。
改错时,可以修改语句中的一部分内容,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
【含有错误的源程序】:
#include <stdio.h>
#include<string.h>
void main()
{
/******found******/
int i,j ; //int i,j=0 ;
char s[79],t[79];
gets(s);
for(i=0;s[i]!='\0';i++)
/******found******/
if(s[i]%2==0) // if(s[i]%2!=0)
{
/******found******/
s[i] =t[j]; //t[j]=s[i];
j++;
}
t[j]='\0';
puts(t);
}
8.3.2 应用提高
【8.14】编程实现,将字符串中所有数字字符移动到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序不变。
程序文件名:ex8_14.c。
测试数据:def35adh3kjsdf7
程序运行结果:defadhkjsdf3537
【参考源程序】:
#include <stdio.h>
void main()
{
int i, j=0, k=0;
char s[80]=" def35adh3kjsdf7",t1[80], t2[80];
printf("\nThe original string is : %s\n",s);
for(i=0; s[i]!='\0'; i++)
if(s[i]>='0' && s[i]<='9')
t2[j++]=s[i]; /*将数字字符放入t2串中*/
else t1[k++]=s[i]; /*将其它字符放入t1串中*/
t2[j]='/0';
t1[k]='/0';
for(i=0; i<k; i++)
s[i]=t1[i];
for(i=0; i<j; i++)
s[k+i]=t2[i];
printf("\nThe result is : %s\n",s);
}
【8.15】程序改错:下列程序的功能是,统计给定字符串中单词的个数。
程序文件名:ex8_7.c。
输入测试数据:This is a C language program.
程序运行结果:There are 6 words in this text.
根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
改错时,可以修改语句中的一部分内容,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
【含有错误的源程序】:
#include <stdio.h>
void main()
{
char str[81];
int n, i, flag=0; //int n=0, i, flag=0;
print("\n Enter a line text:\n"); //printf("\n Enter a line text:\n");
gets(str);
i=0;
while(str[i]!='\0')
{
if(str[i]==' '&&flag==0) // if(str[i]!=' '&&flag==0)
{
n++ ;
flag=1;
}
if (str[i]!=' ') flag= 0 ; // if (str[i]==' ')
i++ ;
}
printf("\nThere are %d words in this text.\n",n);
}
小结:
统计单词个数,我们可以从判断当前字符是否为空格开始,如果是空格,则说明未出现新字符,此时flag为0;如果不是空格,我们就要判断前一个字符是否为空格,如果是空格,则说明开始出现新单词,此时n增1,flag置为1;如果不是空格,则说明不是新单词,flag仍为1,n不变。
8.4实验思考
【思考1】输入一个字符串“Welcome to C!”,并输出。
分别用scanf函数和gets函数实现,观察其程序运行结果,总结scanf函数与gets函数的区别。
#include<stdio.h>
void main(){
char str1[20],str2[20],str3[20];
scanf("%s",str1);
scanf("%s",str2);
scanf("%s",str3);
printf("%s %s %s",str1,str2,str3);
}
#include "stdio.h"
void main()
{ char str[20];int i;
gets(str);
puts(str) ;
}
scanf函数与gets函数的区别:gets函数可以接收空格;而scanf函数在使用%s格式符输入字符串时遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。
【思考2】字符串处理函数,求字符串长度函数strlen,字符串连接函数strcat,字符串拷贝函数strcpy,字符串比较函数strcmp等在程序设计时提供了很多方便。
若不采用上述字符串处理函数也可以实现相应功能。
编程实现○1求任意字符串长度;○2将两个字符串连接起来;○3实现字符串的拷贝;○4进行比较两个字符串的大小。
【参考源程序】:
求串长:
#include "stdio.h"
void main()
{int i=0;char str[100];
gets(str);
while(str[i]!='\0')
i++;
printf("length=%d",i);
}
字符串连接:
#include "stdio.h"
void main()
{char a[100],b[20]; int i ,j;
gets(a); gets(b);
i=0;
while(a[i]!= '\0')i++;
for(j=0;b[j]!= '\0';j++)
a[i++]=b[j] ;
a[i]='\0';
puts(a);}
字符串拷贝:
#include "stdio.h"
void main ()
{ char a[100]; char b[100]; int i;
gets(a);
for(i=0;a[i-1]!='\0';i++)
{
b[i] = a[i];
}
printf("%s\n",b);
}
字符串比较:
#include "stdio.h"
void main()
{ char str1[20],str2[20];
int i=0,k;
gets(str1); gets(str2);
while(str1[i])
if(str1[i]!=str2[i]) break;
else i++; k=str1[i]-str2[i];
if(k==0) printf("str1=str2\n");
else if(k>0) printf("str1>str2\n");
else printf("str1<str2\n");
}。