尝试在C编程中使用结构和功能将单数名词更改为复数形式

时间:2018-12-29 04:39:47

标签: c

根据以下要求编写程序:

(i)定义一个名为Noun的结构,该结构包含一个称为单数的字符串和另一个字符串 命名为复数。

(ii)编写一个名为pluralize的函数,该函数会将单数名词转换为复数形式并将其存储在结构变量中的字符串中。该函数应接收结构作为输出参数,并且不返回任何内容。 将单数名词转换为复数形式的规则如下所示:

“ y”替换为“ ies”

“ s”,“ ch”,“ sh”,“ x”添加“ es”

其他人添加“ s”

(iii)编写另一个名为addNouns的函数,该函数将打开一个二进制文件nouns.dat进行追加,并在其中添加一些名词。该函数应将结构变量(如上文(i)所述)作为输入参数,并返回1(true)表示已成功添加数据,否则返回0(false)。 [注意:如果在二进制文件中找不到名词,则不要追加。]

(iv)您的程序应允许连续请求单数名词转换,直到没有更多名词可用为止。

Q7 *。编写一个程序以从名词(.Q6中创建)中读取数据。将nouns.dat中的数据写入 文本文件nouns.txt,并以以下格式显示在屏幕上: 教堂教堂 工具箱工具箱 表表 复制副本

我正在使用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");
}

希望可以得到如下输出: 教堂教堂 工具箱工具箱 表表 复制副本

1 个答案:

答案 0 :(得分:0)

此代码有些错误

首先排队:

noun->singular[len - 1] == 'sh' || noun->singular[len - 1] == 'x')

''表示字符'sh'不是字符,而是字符串,因此必须用“ sh”表示

您不能将字符串与字符进行比较

一开始是Typedef名词,否则函数原型将不知道您指的是什么

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;

希望这可以作为您出错的指南。