代码如下,但是示例有个输出 puiz 的复数虽然是 puizzes 。但是题目中并没有描述双写词尾字母的规则。所以我没有考虑。
#include<iostream>
#include<string.h>
using namespace std;
void RegularPluralForm(char * word);
void MultiplePluralForm(char * target, char * source);
int main() {
char str1[201];
char str2[400];
cin.getline(str1, 201, '\n');
MultiplePluralForm(str2, str1);
cout << str2 << endl;
return 0;
}
void RegularPluralForm(char * word) {
int len = strlen(word);
switch (word[len - 1]) {
case 's':
case 'x':
case 'z':
word[len] = 'e';
word[len + 1] = 's' ;
word[len + 2] = '\0';
break;
case 'h':
if (word[len - 2] == 's' || word[len - 2] == 'c' ) {
word[len] = 'e';
word[len + 1] = 's' ;
word[len + 2] = '\0';
} else {
word[len ] = 's' ;
word[len + 1] = '\0';
}
break;
case 'y' :
if ( word[len - 2] == 'a' || word[len - 2] == 'i' || word[len - 2] == 'e' || word[len - 2] == 'o' || word[len - 2] == 'u') {
word[len ] = 's' ;
word[len + 1] = '\0';
} else {
word[len - 1 ] = 'i';
word[len] = 'e';
word[len + 1] = 's' ;
word[len + 2] = '\0';
}
break;
case 'f' :
word[len - 1] = 'v';
word[len] = 'e';
word[len + 1] = 's';
word[len + 2] = '\0';
break;
case 'e':
if ( word[len - 2] == 'f' ) {
word[len - 2] = 'v';
word[len - 1 ] = 'e';
word[len ] = 's';
word[len + 1] = '\0';
} else {
word[len ] = 's' ;
word[len + 1] = '\0';
}
default :
word[len ] = 's' ;
word[len + 1] = '\0';
}
}
void MultiplePluralForm(char * target, char * source) {
int len = 0;
for ( int i = 0 ; source[i] != '\0' ; i++ ) {
// 读取一个单词转成复数
char word[30] = {0};
int j = 0 ;
for (j = 0 ; source[i + j] != ' ' && source[i + j] != '\0' ; j ++) {
word[j] = source[i + j];
}
i += j;
word[j] = '\0';
RegularPluralForm(word);
for ( j = 0; word[j] != '\0' ; j++) {
target[len + j] = word[j];
if( word[j+1] == '\0' ){
j++;
target[len+j] = ' ';
j++;
break;
}
}
len += j;
}
target[len] = '\0';
}
状态不是很好,但是勉强能看。