变位词
题目
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 100
#define N 20
int main(int argc, const char * argv[]){
FILE *fp;
char fileName[N];
char s[N];// 待比较的单词;
char str[M][N];// 存储文件的单词
char save[M][N];// v保存匹配上的单词
char ch; // 文件读写的字符
int i,j=0,m=0,n=0;
printf("请输入单词\n");
gets(s);
// 输入的字符串转换字符串为小写
for (i=0; s[i]!='\0'; i++) {
if (s[i]>='A'&&s[i]<='Z') {
s[i]=s[i]+32;
}
}
printf("请输入文件名称\n");
gets(fileName);
if ((fp=fopen(fileName, "r"))==NULL) {
printf("文件打开出错\n");
return 0;
}
// 读写文件的数据 将文件写入字符数组中
i=0;
while (!feof(fp)) {
ch=fgetc(fp);
if (ch!=' '&&ch!='\t'&&ch!='\n') {
if (ch>='A'&&ch<='Z') {
ch=ch+32;
}
str[i][j++]=ch;
}else{
str[i][j]='\0';
i++;
j=0;
n++;
}
}
// 寻找数组中的变位词,将其保存在数组save中
int flag=0;
for (i=0; i<n; i++) {
flag=0;
if (strlen(str[i])==strlen(s)) {
for (j=0; str[i][j]!='\0'; j++) {
flag=0;
for (int k =0; s[k]!='\0'; k++) {
if (str[i][j]==s[k]) {
flag=1;
break;
}
}
if (flag==0) {
break;
}
}
}
if (flag==1) {
strcpy(save[m++],str[i]);
}
}
// 检测相同的数组变位词,即删掉相同的变位词
char t[N];
for (i=0; i<m; i++) {
for (j=i+1; j<m; j++) {
if (strcmp(save[i],save[j])==0) {
save[j][0]='\0';
}
}
}
// 排序sava中的变位词,让其按字母升序保存。
for (i=0; i<m; i++) {
for (j=i+1; j<m; j++) {
if (save[j][0]!='\0'&&save[i][0]>save[j][0]) {
strcpy(t,save[i]);
strcpy(save[i],save[j]);
strcpy(save[j],t);
}
}
}
// 输出变位词
for (i=0; i<m; i++) {
if (save[i][0]!='\0') {
puts(save[i]);
}
}
return 0;
}
效果