单词复数。某单词本(文件)中有若干行单词单数形式,请在该单词后面给出单词复数形式,即单
词本中每一行是“单数 复数”形式。注:如果单词以 s、x、z、ch、或 sh 结尾,单词加 es;如果单词以 y 结
尾,并且 y 前面是一个辅音,将 y 改为 ies;对其他单词,后面加 s。
要代码,最好有备注
适用于每行一个单词的情况
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 1024
typedef enum
{
WORDS_ADD_S = 0,
WORDS_ADD_ES,
WORDS_ADD_IES,
}words_add_enum;
char yuanyi_judge(char c)
{
int i = 0;
char yuanyin[] = {'a','e','i','o','u'};
for(;i < strlen(yuanyin); i++)
{
if(c == yuanyin[i])
{
// printf("是元音\n");
return 1;
}
}
//printf("不是元音\n");
return 0;
}
//判断末尾是否需要加es,last 最后一个单词,second 倒数第二个单词
char words_is_nedd_add_es(char last,char second)
{
char res = 0;
if(last == 'h')
{
if(second == 'c' || second == 's')
{
res = 1;
}
}
else if(last == 's' || last == 'x'|| last == 'z')
{
res = 1;
}
else
{
res = 0;
}
//printf("末尾需要加es吗:%s\n",res == 1 ? "yes":"no");
return res;
}
char data_combin(char *src,FILE *save)
{
int data_len = 0;
char *temp = NULL;
words_add_enum words_add = WORDS_ADD_S;
if(!src || !save)
{
//printf("%s,参数为空\n",__FUNC__);
return 0;
}
data_len = strlen(src) ;
//数据长度不含换行符
if(src[data_len - 1] == '\n')
{
src[data_len - 1] = '\0';
data_len -= 1;
}
///拷贝单词
temp = (char *)malloc(data_len + 1);
strcpy(temp,src);
if(data_len <= 1)
{
printf("单词无复数,原样输出\n");
fputs(src,save);
fputs("\n",save);
}
else
{
if(src[data_len -1] == 'y')
{
//是元音,加s
if(!yuanyi_judge(src[data_len -2]))
{
words_add = WORDS_ADD_IES;
}
}
else if(words_is_nedd_add_es(src[data_len -1],src[data_len -2]))
{
words_add = WORDS_ADD_ES;
}
//src[data_len-1]='\0';
if(words_add == WORDS_ADD_ES)
{
sprintf(src + data_len," %s%s\n",temp,"es");
}
else if(words_add == WORDS_ADD_IES)
{
sprintf(src + data_len," %s",temp);
//去掉y
sprintf(src + strlen(src) - 1 ,"%s\n","ies");
}
else
{
//sprintf(src + data_len," %s%s",src,"s");
sprintf(src + data_len," %s%s\n",temp,"s");
}
///不会自动输出换行
fputs(src,save);
}
//释放内存
free(temp);
printf("复数%s\n",src);
return 1;
}
//in_path 数据原始文件,out_path 转换后保存的文件
void words_convert(char *in_path,char *out_path)
{
FILE *fp = NULL;
FILE *fp_save = NULL;
int num = 0;
//char *temp_path = "./temp.txt";
char buf[BUFFER_SIZE] = {0};
if(!in_path || !out_path)
{
return ;
}
if((fp = fopen(in_path,"r")) == NULL)
{
printf("读取数据文件失败\n");
return ;
}
if((fp_save = fopen(out_path,"w")) == NULL)
{
printf("创建临时数据文件失败\n");
return ;
}
while(!feof(fp))
{
memset(buf,0,BUFFER_SIZE);
if(!fgets(buf,BUFFER_SIZE,fp))
{
printf("读取数据文件出错\n");
return;
}
data_combin(buf,fp_save);
}
fclose(fp);
fclose(fp_save);
}
//函数适用用每行一个单词的情况
void main(void)
{
words_convert("words.txt","temp.txt");
system("pause");
}
char word[200];
scanf("%s", word);
int n = strlen(word);
if (word[n - 1] == 's' || word[n - 1] == 'x' || word[n - 1] == 'z')
{
word[n] = 'e';
word[n + 1] = 's';
word[n + 2] = '\0';
}
else if (n >= 2 && word[n - 1] == 'h')
{
if (word[n - 2] == 'c' || word[n - 2] == 's')
{
word[n] = 'e';
word[n + 1] = 's';
word[n + 2] = '\0';
}
else
{word[n]='s';word[n+1]='\0';}
}
else if (n >= 2 && word[n - 1] == 'y')
{
if (word[n - 2] != 'a' && word[n - 2] != 'e' && word[n - 2] != 'i' && word[n - 2] != 'o' && word[n - 2] != 'u')
{
word[n - 1] = 'i';
word[n] = 'e';
word[n + 1] = 's';
word[n + 2] = '\0';
}
else
{word[n]='s';word[n+1]='\0';}
}
else
{word[n]='s';word[n+1]='\0';}
printf("%s", word);