C编程:单数到复数名词

时间:2011-08-30 17:31:43

标签: c

我的节目应该

编写一个程序,它根据你的规则取名词并形成复数形式:

  1. 如果名词以“y”结尾,则删除“y”并添加“ies”。
  2. 如果名词以“s”,“c”,“ch”或“sh”结尾,请添加“es”。
  3. 在所有其他情况下,只需添加“s”。
  4. 打印每个名词及其复数。

    它工作正常,当我输入像奶制品这样的字母打印奶牛场时,它会循环并打印dairiesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesesese我希望这是一个我找不到的快速解决方案,有人可以帮助我!

    谢谢!

    #include <stdio.h>
    #include <string.h>
    
    
    
    #define max_word 20
    
    
    
    /* prototypes */
    void pluralize (char word[]);
    
    
    int main (void)
    { 
      char noun[max_word];   /* stores temporary word entered by user */
    
      printf("Enter a noun in singular form: ");
      scanf("%s", noun);
    
      while (strcmp(noun, "done") != 0)
     {
        pluralize (noun);
        printf("The plural form is %s\n", noun);
     }
    
      return;
    }
    
    void pluralize (char word[])
    {
      int length;
      char noun;
      length=1;
      length = strlen(word);
    
       if (word[length - 1] == 'y') 
     {   word[length - 1] = 'i';
         word[length] = 'e';
        word[length + 1] = 's';
        word[length + 2] = '\0';  
      }
    
    
      /* if word ends in "s" "ch" or "sh" add "es" */
    
     else if (word[length - 1] == 's' ||
        (word[length - 2] == 'c' && word[length - 1] == 'h') ||
        (word[length - 2] == 's' && word[length - 1] == 'h'))
      {  strcat(word, "es");
      }
    
      else
     {   strcat(word, "s");
    
        printf("New word is: ", &noun);
    } 
    return;
    }
    

1 个答案:

答案 0 :(得分:2)

我假设您希望程序在用户输入文本done时终止。如果是这样,你需要修复你的循环:

for (;;) 
{
    printf("Enter a noun in singular form: ");
    scanf("%s", noun);

    if ((strcmp(noun, "done") == 0)
        break;

    pluralize (noun);
    printf("The plural form is %s\n", noun);
}

当前版本将循环,直到pluralize()将字符串设置为done,这将永远不会发生。

作为旁注,您应该使用strncmp()strncat()来避免潜在的缓冲区溢出。这在此类代码中并不重要,但如果您曾经撰写过面向不受信任用户的内容,则可以使用strcmp()strcat()让自己陷入严重的安全漏洞。