字符数组使用举例
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组
字符数组使用举例
【例1:】输入一串字符,将其中的小写英文字母转换为大写字母,其 他字符保持不变
解题思路
• 使用循环结构,从第一个字符开始,判断字符串中的每一个字符, 直到遇到字符串的结束标志(’\0’)为止。如果该字符是小写英文字 母,则将其减32(大小写英文字母的ASCII码差值),否则,就不 做操作
if(tmp>'Z') tmp-=26;
}
else if(st1[i]>='a' && st1[i]<='z')
{ tmp=st1[i]+K; //如果是小写英文字母,则将其变为后面的第K个字母
if(tmp>'z') tmp-=26;
}
else tmp=st1[i];
//如果不是英文字母,则保持不变
str[0] 'W'
'a'
'n'
'g'
'\0'
str[1]
'L'
'i'
'\0'
str[2]
'J'
'i'
'a'
'n'
'g'
'\0'
str[3]
'S'
'u'
'n'
'\0'
【例5:】从键盘上输入5个字符串,要求找出其中的最大者
解题思路
• 将5个字符串存放在一个二维数组中,用一个变量(如:k)存放目 前找到的最大字符串的序号(行号)。先假设第一个字符串最大 (k=0),然后将其依次与后面每一个字符串比较,若某字符串大 于第k个字符串,则将k修改为该字符串的序号(行号) ,循环结 束后,变量k中一定是最大字符串的序号(行号)
#include<stdio.h>
实
#include<string.h>
现
void main ( )
{char str[N][20],temp[20];
int i,j;
printf("请输入%d个字符串: \n",N);
for (i=0;i<N;i++) //输入N个字符串
gets(str[i]);
printf("请输入原字符串:\n");
gets(st1);
for(i=0; st1[i]!='\0'; i++)
{ if( isalpha(st1[i]) !=0 ) //使用字符测试函数判断其是否是英文字母
{ tmp=st1[i]+K;
if (tmp>'Z' && tmp<='Z'+K || tmp>'z') tmp-=26;
}
else
tmp=st1[i];
st2[i]=tmp;
}
st2[i]='\0';
printf("加密后的字符串:\n");
puts(st2);
}
字
1 函数原型:int isalpha(char c)
符
功能:检查参数c是否为英文字母
测 试 函
2 函数原型:int isupper(char c) 功能:检查参数c是否为大写英文字母
实 现
int i,j=0; printf("请输入字符串:\n");
gets(s);
//输入原字符串
for(i=0;i<strlen(s);i++)
//将字符串中下标为奇数或者ASCII值为偶数的字符存到另一数组中
if(i%2!=0 || s[i]%2==0)
{d[ j]=s[i];
j++;
}
d[ j]=‘\0’;
添加结束符‘\0’
【例4:】删除字符串中下标为偶数同时ASCII值为奇数的字符,将剩余 的字符形成的新串放在另一数组中
解题思路
• 使用循环语句来解决这个问题。逐个对原数组元素的下标和ASCII 码的值进行判断,将满足要求的元素赋给新的字符数组
程
void main( )
序
{char s[80],d[80];
st2[i]=tmp;
}
st2[i]=‘\0’;
//在末尾加上字符串结束标志
printf("加密后的字符串:\n");
puts(st2);
}
程 序 实 现
#include<stdio.h> #include<ctype.h> #define K 3 void main( ) {int i;
char st1[80],st2[80],tmp;
for (i=0;i<N-1;i++) //使用冒泡排序法
for( j=0;j<N-1-i;j++)
//如果前一个字符串小于后一个字符串,则将其交换
if (strcmp(str[ j], str[ j+1])<0)
{strcpy(temp,str[ j]);
strcpy(str[ j],str[ j+1]);
strcpy(str[ j+1],temp);
}
printf("\n排序后: \n");
for (i=0;i<N;i++) //输出N个字符串
puts(str[i]);
}
西华大学
谢谢
数
3 函数原型:int islower(char c)
功能:检查参数c是否为小写英文字母
4 函数原型:int isdigit(char c) 功能:检查参数c是否为阿拉伯数字0到9
5 函数原型:int isspace(char c)
功能:检查参数c是否为空格字符
6 函数原型:int isalnum(char c)
解题 • 逐字符处理:将每个字母加一序数K,即用它后的第K个字母代替。 思路 例如序数K为3,这时 A→ D, a→d,B→E, b→e ... 当加序数后
的字母超过Z或z,则将其减26
简单的加密过程
例 输入: You are good!
加密后的字符串为: Brx duh jrrg!
程
#include<stdio.h> #define K 3
序
void main( )
实
{int i;
现
char st1[80],st2[80],tmp; printf("请输入原字符串:\n");
gets(st1);
for(i=0; st1[i]!='\0'; i++) //逐字符处理
{ if(st1[i]>='A' && st1[i]<=‘Z')
{ tmp=st1[i]+K; //如果当前字符是大写英文字母,则将其变为后面的第K个字母
int i; printf(“Input a string:”); gets(str1); for(i=0;str1[i]!=‘\0’;i++)
str2[i]=str1[i]; str2[i]=‘\0’; puts(str2); }
将第一个字符串中的字符 逐个添加到数组str2数组 中(不包含结束符‘\0’)
程
#include<stdio.h>
序 实
#include<string.h>
现
void main ( )
{char str[5][20];
int i, k=0;
for (i=0;i<5;i++) //输入五个字符串
gets (str[i]);
for (i=1;i<5;i++)
//如果第i个字符串大于目前找到的最大字符串,则修改k
puts(str);
//或:printf("%s\n", str);
}
注意
for(i=0;str[i]!='\0';i++) for(i=0;str[i]!=0; i++) for(i=0;str[i];i++)
等价
【例2:】输入一串字符,将其中的英文字母加密,非英文字母不变,将 加密后的字符串放入另一个字符数组中
程 序 实 现
#include<stdio.h> void main( ) { int i;
char str[80];
gets(str);
for(i=0;str[i]!='\0';i++) //逐字符操作,直到遇到结束标志为止
if(str[i]>='a'&& str[i]<='z')
str[i]=str[i]-32;
功能:检查参数c是否为英文字母或阿拉伯数字
说明 • 返回值:若参数c为相应字符时,则返回TRUE(非零),否则返回NULL(0)
• 需包含头文件: #include<ctype.h>
【例3:】从键盘输入一个字符串,复制到另一个字符数组后显示
解题思路:逐字符复制
#include “stdio.h” void main() { char str1[20],str2[20];
//在结果字符串的尾部加上结束标志
printf("\n结果字符串:\n");
puts(d);
}
二维字符数组的使用
char str[4][10]={ "Wang", "Li","Jiang", "Sun" };
说明 可以使用二维字符数组存储一组字符串 每个字符串的存储空间是相同的 ➢ str是数组名,包含四个元素 str[0],str[1],str[2] ,str[3] ➢ 每个元素str[i]又是一个一维数组,包含10个元素 ➢ 每个字符串的存储地址可以用str[i]表示(与&str[i][0]等价 )
if (strcmp(str[i], str[k])>0) k=i;
printf(“\n最大字符串是: %s \n",str[k]);
}
【例6:】从键盘上输入若干个字符串,要求将其按降序排列 解题思路
• 将N个字符串存放在一个二维数组中,使用某种排序算法将其按降 序排列
程
#define N 5
序
字符数组使用举例
【例1:】输入一串字符,将其中的小写英文字母转换为大写字母,其 他字符保持不变
解题思路
• 使用循环结构,从第一个字符开始,判断字符串中的每一个字符, 直到遇到字符串的结束标志(’\0’)为止。如果该字符是小写英文字 母,则将其减32(大小写英文字母的ASCII码差值),否则,就不 做操作
if(tmp>'Z') tmp-=26;
}
else if(st1[i]>='a' && st1[i]<='z')
{ tmp=st1[i]+K; //如果是小写英文字母,则将其变为后面的第K个字母
if(tmp>'z') tmp-=26;
}
else tmp=st1[i];
//如果不是英文字母,则保持不变
str[0] 'W'
'a'
'n'
'g'
'\0'
str[1]
'L'
'i'
'\0'
str[2]
'J'
'i'
'a'
'n'
'g'
'\0'
str[3]
'S'
'u'
'n'
'\0'
【例5:】从键盘上输入5个字符串,要求找出其中的最大者
解题思路
• 将5个字符串存放在一个二维数组中,用一个变量(如:k)存放目 前找到的最大字符串的序号(行号)。先假设第一个字符串最大 (k=0),然后将其依次与后面每一个字符串比较,若某字符串大 于第k个字符串,则将k修改为该字符串的序号(行号) ,循环结 束后,变量k中一定是最大字符串的序号(行号)
#include<stdio.h>
实
#include<string.h>
现
void main ( )
{char str[N][20],temp[20];
int i,j;
printf("请输入%d个字符串: \n",N);
for (i=0;i<N;i++) //输入N个字符串
gets(str[i]);
printf("请输入原字符串:\n");
gets(st1);
for(i=0; st1[i]!='\0'; i++)
{ if( isalpha(st1[i]) !=0 ) //使用字符测试函数判断其是否是英文字母
{ tmp=st1[i]+K;
if (tmp>'Z' && tmp<='Z'+K || tmp>'z') tmp-=26;
}
else
tmp=st1[i];
st2[i]=tmp;
}
st2[i]='\0';
printf("加密后的字符串:\n");
puts(st2);
}
字
1 函数原型:int isalpha(char c)
符
功能:检查参数c是否为英文字母
测 试 函
2 函数原型:int isupper(char c) 功能:检查参数c是否为大写英文字母
实 现
int i,j=0; printf("请输入字符串:\n");
gets(s);
//输入原字符串
for(i=0;i<strlen(s);i++)
//将字符串中下标为奇数或者ASCII值为偶数的字符存到另一数组中
if(i%2!=0 || s[i]%2==0)
{d[ j]=s[i];
j++;
}
d[ j]=‘\0’;
添加结束符‘\0’
【例4:】删除字符串中下标为偶数同时ASCII值为奇数的字符,将剩余 的字符形成的新串放在另一数组中
解题思路
• 使用循环语句来解决这个问题。逐个对原数组元素的下标和ASCII 码的值进行判断,将满足要求的元素赋给新的字符数组
程
void main( )
序
{char s[80],d[80];
st2[i]=tmp;
}
st2[i]=‘\0’;
//在末尾加上字符串结束标志
printf("加密后的字符串:\n");
puts(st2);
}
程 序 实 现
#include<stdio.h> #include<ctype.h> #define K 3 void main( ) {int i;
char st1[80],st2[80],tmp;
for (i=0;i<N-1;i++) //使用冒泡排序法
for( j=0;j<N-1-i;j++)
//如果前一个字符串小于后一个字符串,则将其交换
if (strcmp(str[ j], str[ j+1])<0)
{strcpy(temp,str[ j]);
strcpy(str[ j],str[ j+1]);
strcpy(str[ j+1],temp);
}
printf("\n排序后: \n");
for (i=0;i<N;i++) //输出N个字符串
puts(str[i]);
}
西华大学
谢谢
数
3 函数原型:int islower(char c)
功能:检查参数c是否为小写英文字母
4 函数原型:int isdigit(char c) 功能:检查参数c是否为阿拉伯数字0到9
5 函数原型:int isspace(char c)
功能:检查参数c是否为空格字符
6 函数原型:int isalnum(char c)
解题 • 逐字符处理:将每个字母加一序数K,即用它后的第K个字母代替。 思路 例如序数K为3,这时 A→ D, a→d,B→E, b→e ... 当加序数后
的字母超过Z或z,则将其减26
简单的加密过程
例 输入: You are good!
加密后的字符串为: Brx duh jrrg!
程
#include<stdio.h> #define K 3
序
void main( )
实
{int i;
现
char st1[80],st2[80],tmp; printf("请输入原字符串:\n");
gets(st1);
for(i=0; st1[i]!='\0'; i++) //逐字符处理
{ if(st1[i]>='A' && st1[i]<=‘Z')
{ tmp=st1[i]+K; //如果当前字符是大写英文字母,则将其变为后面的第K个字母
int i; printf(“Input a string:”); gets(str1); for(i=0;str1[i]!=‘\0’;i++)
str2[i]=str1[i]; str2[i]=‘\0’; puts(str2); }
将第一个字符串中的字符 逐个添加到数组str2数组 中(不包含结束符‘\0’)
程
#include<stdio.h>
序 实
#include<string.h>
现
void main ( )
{char str[5][20];
int i, k=0;
for (i=0;i<5;i++) //输入五个字符串
gets (str[i]);
for (i=1;i<5;i++)
//如果第i个字符串大于目前找到的最大字符串,则修改k
puts(str);
//或:printf("%s\n", str);
}
注意
for(i=0;str[i]!='\0';i++) for(i=0;str[i]!=0; i++) for(i=0;str[i];i++)
等价
【例2:】输入一串字符,将其中的英文字母加密,非英文字母不变,将 加密后的字符串放入另一个字符数组中
程 序 实 现
#include<stdio.h> void main( ) { int i;
char str[80];
gets(str);
for(i=0;str[i]!='\0';i++) //逐字符操作,直到遇到结束标志为止
if(str[i]>='a'&& str[i]<='z')
str[i]=str[i]-32;
功能:检查参数c是否为英文字母或阿拉伯数字
说明 • 返回值:若参数c为相应字符时,则返回TRUE(非零),否则返回NULL(0)
• 需包含头文件: #include<ctype.h>
【例3:】从键盘输入一个字符串,复制到另一个字符数组后显示
解题思路:逐字符复制
#include “stdio.h” void main() { char str1[20],str2[20];
//在结果字符串的尾部加上结束标志
printf("\n结果字符串:\n");
puts(d);
}
二维字符数组的使用
char str[4][10]={ "Wang", "Li","Jiang", "Sun" };
说明 可以使用二维字符数组存储一组字符串 每个字符串的存储空间是相同的 ➢ str是数组名,包含四个元素 str[0],str[1],str[2] ,str[3] ➢ 每个元素str[i]又是一个一维数组,包含10个元素 ➢ 每个字符串的存储地址可以用str[i]表示(与&str[i][0]等价 )
if (strcmp(str[i], str[k])>0) k=i;
printf(“\n最大字符串是: %s \n",str[k]);
}
【例6:】从键盘上输入若干个字符串,要求将其按降序排列 解题思路
• 将N个字符串存放在一个二维数组中,使用某种排序算法将其按降 序排列
程
#define N 5
序