从单词C ++开始按顺序消除元音

时间:2017-11-21 14:52:36

标签: c++

第一次在StackOverflow上。在编程时对我的期末考试进行学习和编码时,我发现了一个我可以在心理上解决的问题,但是当我尝试将它放在C ++中时,它并没有真正起作用。

所以问题在于我的母语罗马尼亚语,但我会尝试翻译它。所以这个问题要我从键盘上读一个单词然后在屏幕上显示它,每次都消除一个元音。例如,如果我在我的程序中输入单词"编程"它应该显示:

  1. progrmming - 消除
  2. 编程 - 消除e
  3. programmng - 消除我
  4. prgramming - 淘汰o
  5. 编程 - 消除你
  6. 我的代码如下所示:

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int main()
    {
        char v[6]="aeiou",s1[21],s2[21];
        int i,j;
        cin.get(s1,20);
        for(i=0;i<strlen(v);i++)
        {
            strcpy(s2,s1);
            j=0;
            while(j<strlen(s2))
            {
                if(strchr(v[i],s2[j])!='\0')
                    strcpy(s2+j,s2+j+1);
                else
                    j++;
            }
            cout<<s2<<endl;
        }
        return 0;
    

    我在&#34;如果&#34;声明,但我似乎无法找到它的解决方案。它删除了&#34; [i]&#34;来自&#34; v [i]&#34;,但我需要一次只消除一个元音,而不是所有元音。希望有人可以帮助我。谢谢!

    编辑:问题解决了,我会把我的代码放在这里,因为问题来自罗马尼亚学士学位课程的编程

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int main()
    {
        char v[6]="aeiou",s1[21],s2[21];
        int i,j,x;
        cin.get(s1,20);
        for(i=0;i<strlen(v);i++)
        {
            strcpy(s2,s1);
            j=0;
            while(j<strlen(s2))
            {
                if(s2[j]==v[i])
                    strcpy(s2+j,s2+j+1);
                else
                    j++;
            }
            cout<<endl;
            cout<<s2<<endl;
        }
        return 0;
    }
    

    对于这种误解感到抱歉,但在这里,我们没有被教导使用std::string::find_first_of之类的内容,只使用strcmpstchr之类的基本功能。

1 个答案:

答案 0 :(得分:0)

好吧,你的最大错误就是你在迭代字符串之前迭代元音。

你应该迭代输入字符串,并且对于每个字符,检查它是否是元音。您可以使用strchr而不是v来检查字符是否为元音。

对于字符串中的每个字符,您有两种情况:

  1. 角色是元音
  2. 角色不是元音
  3. 在第一种情况下,您应该从字符串中删除该字符,这意味着字符串的剩余内容移到左侧。

    例如,如果您的字符串是编程并且您跳转到第一个 o ,则必须将剩余的 gramming 移动到左:

    0 1 2 3 4 5 6 7 8 9 10
    p r o g r a m m i n g
    p r   g r a m m i n g
    p r g r a m m i n g
    

    在第二种情况下没有任何反应(除非您将字符串char通过char复制到辅助存储字符串,这是有效的,顺便说一下。)

    查看以下解决方案,它使用[memmove][1]将字符串向左移动,但也可以使用简单的for循环完成。阅读,研究并理解它。如果您需要更多帮助,请不要犹豫。

    void incremental_vowel_removal(const char *instr) {
      // the vowels
      static const char *vowels = "aeiou";
    
      // length of the input string
      int len = strlen(instr);
    
      // I will work on a copy of the string because it is easier
      char *ostr = (char*)malloc((len+1) * sizeof(char));
      strcpy(ostr, instr);
    
      // for each char in the string
      for (int i = 0; i < len; ++i) {
        // if it is a vowel
        if (strchr(vowels, ostr[i])) {
          // shift remaining string to the left
          // this will erase the currect character from the string
          memmove(ostr+i, ostr+i+1, len-i);
          // print this partial result
          printf("%s\n", ostr);
          // the length is decreased by one, so let's reflect it
          len -= 1;
        }
      }
    
      // free the allocated memory
      free(ostr);
    } 
    

    更新:我将calloc替换为malloc,因为无需对字符串进行零初始化,因为之后会调用strcpy