输入字符串;
2
对字符串进行排序;
3
输出。
排序中需要注意:
1
用strcmp比较字符串;
2
用strcpy执行字符串的赋值。
代码如下:
#define N 50
int main()
{
char s[N][100]
int i,j
for(i = 0i <Ni ++)
scanf("%s",s[i])
for(i = 0i <N-1i ++)
{
for(j = i+1j <Nj ++)
{
if(strcmp(s[i],s[j])>0)
{
char t[100]
strcpy(t,s[i])
strcpy(s[i],s[j])
strcpy(s[j],t)
}
}
}
for(i = 0i <Ni ++)
puts(s[i])
}
根据你的题意。
第一行输入是26个字母的指定顺序。
第二行输入是内容字符串。
将内容字符串中的字母按照指定顺序替换成对应26个字母原顺序的字母。
规则:第一行输入必须是26个小写母,且不能重复。
替换后的字符中字母大小写参照原字符串。
下面是代码:
#include<stdio.h>
#include<string.h>
#define MAXLEN 100//第二行输入字符串的最大长度
char *inPutNewOrder()//输入26个字母的新顺序,必须为小写字母,不能有重复。输入成功返回字符串,失败返回NULL
char getNewLetter(char cIn,char newOrder[27])//获取字母对应newOrder的原始字母,成功返回字母,失败返回0
int main()
{
int i
char *newOrder//输入新字母顺序
char inputStr[MAXLEN],cIn
while(1)
{
newOrder=NULL
while(!newOrder)
newOrder=inPutNewOrder()
memset(inputStr,0,sizeof(char)*MAXLEN)
for(i=0i<MAXLENi++)
{
cIn=getchar()
if(cIn==10)//回车结束输入
break
if((cIn>=65 &&cIn<=90)||(cIn>=97 &&cIn<=122))//如输入的是字母,对应新字母顺序,找到原字母
inputStr[i]=getNewLetter(cIn,newOrder)
else
inputStr[i]=cIn
}
if(i==MAXLEN)
while ((cIn = getchar()) != EOF &&cIn != '\n')
printf("%s\n\n",inputStr)
}
return 0
}
char *inPutNewOrder()//输入26个字母的新顺序,必须为小写字母,不能有重复
{
int i=0,j,flag=1
static char newOrder[27]
char c=0
memset(newOrder,0,sizeof(char)*27)
while(1)
{
if(newOrder[25]!=0)
break
c=getchar()
if(c<97 || c>122)//输入小写字母以外字符,标识错误
flag=0
for(j=0flag &&j<ij++)
if(newOrder[j]==c)//输入重复,标识错误
flag=0
if(!flag)//错误,终止输入
{
printf("输入格式错误!必须为26个小写字母,且不能有重复,请重新输入。\n")
while ((c = getchar()) != EOF &&c != '\n')
return NULL
}
newOrder[i]=c
i++
}
while ((c = getchar()) != EOF &&c != '\n')
return newOrder
}
char getNewLetter(char cIn,char newOrder[27])//获取字母对应newOrder的原始字母,成功返回字母,失败返回0
{
static char letters[]="abcdefghijklmnopqrstuvwxyz"
char c
int i,flag//flag=1大写字母,flag=0是小写字母
if(cIn>=65 &&cIn<=90)//输入的是大写字母
c=cIn+32,flag=1
if(cIn>=97 &&cIn<=122)//输入的是小写字母
c=cIn,flag=0
for(i=0i<26i++)
if(newOrder[i]==c)//在新序列中匹配大写字母或小写字母
{
if(flag)
return letters[i]-32
else
return letters[i]
}
return 0
}