根据以下要求编写程序:
(i) 定义一个名为 Noun 的结构,其中包含一个名为 Single 的字符串和另一个字符串 命名为复数。
(ii) 编写一个名为pluralize 的函数,它将单数名词转换为复数形式,并将其存储到结构变量中的字符串复数中。该函数应该接收一个结构作为输出参数并且不返回任何内容。 将单数名词转换为复数形式的规则如下所示:
将“y”替换为“ies”
‘s’、‘ch’、‘sh’、‘x’添加‘es’
其他加“s”
(iii) 编写另一个名为 addNouns 的函数,该函数将打开一个二进制文件 nouns.dat 进行追加,并向其中添加一些名词。该函数应接收结构变量(如上面 (i) 中定义)作为输入参数,并返回 1 (true) 以指示数据已成功添加,否则返回 0 (false)。 [注意:如果在二进制文件中找到名词,则不要追加。]
(iv) 您的程序应允许连续请求单数名词进行转换,直到没有更多名词可用为止。
Q7*。编写一个程序从 nouns.dat(在 Q6 中创建)读取数据。将 nouns.dat 中的数据写入 一个文本文件 nouns.txt,并以如下格式将其显示在屏幕上: 教堂 教堂 工具箱 工具箱 table table 复制副本
我正在使用 MS Visual Studio 2017 版本 15.9.4 它一直给我错误,比如语法错误!但我找不到我的代码有什么问题。该程序能够将数据写入二进制文件,但是当我将这些数据读入结构变量时,它给了我未知的字符......
int addNouns(Noun *s);
void pluralize(Noun *noun);
typedef struct{
char singular[30], plural[30];
}Noun;
void pluralize(Noun *noun)
{
int len;
FILE *f2;
f2 = fopen("nouns.dat", "rb");
if (f2 == NULL)
{
printf("Unable to open file!\n");
exit(-1);
}
while (fread(&noun->singular, sizeof(noun->singular), 1, f2) != 0) {
len = strlen(noun->singular);
if (noun->singular[len - 1] == 'y')
{
noun->singular[len - 1] = 'i';
noun->singular[len] = 'e';
noun->singular[len + 1] = 's';
*noun->plural = noun->singular;
}
else if (noun->singular[len - 1] == 's' || noun->singular[len - 1] == 'ch' ||
noun->singular[len - 1] == 'sh' || noun->singular[len - 1] == 'x')
{
noun->singular[len - 1] = 'e';
noun->singular[len] = 's';
*noun->plural = noun->singular;
}
else {
noun->singular[len - 1] = 's';
*noun->plural = noun->singular;
}
}
}
int addNouns(Noun *s)
{
char yon;
FILE *f1;
f1 = fopen("nouns.dat", "ab");
printf("Do you want to enter nouns>");
scanf("%c", &yon);
while (toupper(yon) == 'Y') {
printf("Enter a nouns(singular)>");
scanf(" %[^\n]", &s->singular);
fwrite(&s->singular, sizeof(s->singular), 1, f1);
printf("Do you want to enter nouns>");
scanf(" %c", &yon);
}
if (fwrite(&s->singular, sizeof(s->singular), 1, f1)==1)
return 1;
else
return 0;
fclose(f1);
}
void main()
{
Noun noun;
addNouns(&noun);
pluralize(&noun);
printf("Singular\t\tPlural\n");
printf("%s\t\t%s", noun.singular, noun.plural);
system("pause");
}
希望能得到如下输出: 教堂 教堂 工具箱 工具箱 table table 复制副本
最佳答案
这段代码有一些问题。
首先排队:
名词->单数[len - 1] == 'sh' ||名词->单数[len - 1] == 'x')
' ' 表示字符 'sh' 不是字符,而是字符串,因此必须用“sh”表示
不能将字符串与字符进行比较
Typedef 名词放在最开始,否则函数原型(prototype)将不知道你指的是什么
typedef struct{
char singular[30], plural[30];
}Noun;
int addNouns(Noun *s);
void pluralize(Noun *noun);
你不能像这样复制字符串。 *名词->复数=名词->单数;
使用 strncpy() 将字符串从 src 复制到 dest。
实现并非最佳
为什么使用当前结构而不是单词/后缀组合? 此外,到处都有缓冲区溢出的可能性。 在堆上分配内存。不要忘记释放它们。
typedef struct{
char *word, *suffix;
}Noun;
希望这可以作为您出错时的指南。
关于c - 尝试使用C编程中的结构和函数将单数名词改为复数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966755/