c - 尝试使用C编程中的结构和函数将单数名词改为复数

标签 c

根据以下要求编写程序:

(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/

相关文章:

c - 为什么在 foreach 宏中使用 "(array) + count"?

c - 当我尝试在我自己以外的机器上运行时,Kruskal 的最小生成树程序 (C) 出现段错误(核心转储)错误

c - 将字符串发送到另一个应用程序的最简单方法是什么? (赢得API)

c++ - Codeblocks 16.01 中警告被视为错误

变量后面可以输出字符串吗? (一行 printf)

将 C 代码编译为动态链接库

c - 如何检查 fork 进程是否仍在从 c 程序运行

c - 浮点到字符串表示

c - 使用 netfilter hook 时打印 skb 数据会使计算机崩溃

c - 为什么矢量化循环没有性能提升