2017-11-21 144 views
0

初めてStackOverflowでここで。プログラミングで私の最後の試験を勉強してコーディングしているうちに、私は精神的に解決できる問題を発見しましたが、C++に入れようとすると実際には機能しません。単語から順番に母音を削除するC++

問題は母国語のルーマニア語ですが、私は翻訳しようとします。だから問題は私がキーボードから単語を読んでから、それを画面に表示して、毎回母音をなくすことを望んでいます。私は私のプログラムで単語を入力する場合たとえば、 "プログラミング" は、それが表示される必要があります。

  1. progrmming - 排除電子
  2. programmng - - 私に
  3. prgrammingをなくす -
  4. oを排除
  5. プログラミングを排除

    0: -
  6. プログラミング
Uを排除

私のコードは次のようになります

#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; 

"if"文でエラーがありますが、修正が見つからないようです。それは私が "[i]"から "[i]"を削除した後に機能しますが、私は一度に1つの母音だけを削除する必要があります。うまくいけば、誰かが私をここで助けることができます。ありがとうございました!

EDIT:問題は解決される問題は、プログラミングでルーマニアバカロレアの被験者から誤解のため

#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のような基本機能。

+2

私は 'のstd :: STRING'と' stringstream'を使用してお勧めします - – UnholySheep

+1

あなたの人生がずっと楽にするとstdする外観を与えるために起こっている::文字列は:: – marom

答えて

0

あなたの大きな間違いは、文字列を反復する前に母音を繰り返していることです。

入力文字列を繰り返し処理し、各文字について、それが母音かどうかを確認する必要があります。 を超えてstrchrを使用すると、charが母音かどうかを確認できます。各文字の

次の2つのケースを持っている文字列に:

  1. 文字が文字が最初のケースでは母音

ではありません、あなたはそれを消去する必要があり母音

  • です文字は文字列の左にある文字列の残りの内容をシフトすることを意味します。後者の場合は何もで

    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 
    

    例えば、をプログラミングあなたの文字列がされている場合、あなたが最初Oに飛び込んだ、あなたは左にをgramming残りを移動しなければなりません(文字列charをcharでコピーしない限り、有効なbtwの二次記憶域ストリングになります)。

    [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); 
    } 
    

    更新:strcpyが後で呼び出されるため、文字列をゼロに初期化する必要がないので、私はmalloccallocを置き換えます。

  • +0

    find_first_ofはい、私は私の誤りを修正しました。あなたは別の種類のコードを書いています( 'cout'の代わりに' printf'、これは普通のCだと思いますが)?しかし、私はあなたのコメントを読んで翻訳をするだけで問題を理解することができました:D –

    +0

    うれしいそれを翻訳することができます!はい、C言語のものがありますが、コードはC++コンパイラを使用してコンパイルされています。 –

    関連する問題