0

私は一日中このプログラムに行き詰まっています。やっと距離が縮まった気がします。文字列内の母音と文字の数を見つける必要があります。最後にそれらを出力します。ただし、プログラムをコンパイルするとクラッシュします。私は構文をチェックし、一日中本を見ました。誰かが助けてくれれば、本当に感謝しています!c-strings を操作する 5 つの同様の関数を作成する必要があるためです。ありがとう!

#include <iostream>
#include <string>
using namespace std;

int specialCounter(char *, int &);


int main()
{

const int SIZE = 51;        //Array size
char userString[SIZE];      // To hold the string
char letter;
int numCons;



// Get the user's input string
cout << "First, Please enter a string (up to 50 characters): " << endl;
cin.getline(userString, SIZE);





// Display output
cout << "The number of vowels found is " << specialCounter(userString, numCons) <<      "." << endl;
cout << "The number of consonants found is " << numCons << "." << endl;


}



int specialCounter(char *strPtr, int &cons)
{
int vowels = 0;
cons = 0;


while (*strPtr != '/0')
{
    if (*strPtr == 'a' || 'A' || 'e' || 'E' || 'i' || 'I' || 'o' || 'O' || 'u' || 'U')
    {
        vowels++;       // if vowel is found, increment vowel counter
                    // go to the next character in the string
    }
    else
    {
        cons++;         // if consonant is found, increment consonant counter
                    // go to the next character in the string
    }

    strPtr++;

}
return vowels;

}
4

3 に答える 3

3

std::stringorを使用しないことに制限されてstd::getlineおり、ユーザーが入力する文字数は 51 文字未満であると想定する必要があります。

クラッシュの原因:

while (*strPtr != '/0')

null 文字はエスケープ コードです。'/0'実装定義の値を持つ複数文字リテラルです。それはおそらく常に真であることを意味します。次のように変更します。

while (*strPtr != '\0') //or while (strPtr)

それとは別に、母音チェックに論理エラーがあります。次のように、母音ごとにチェックする必要があります。

if (*strPtr == 'a' || *strPtr == 'e') //etc.

toupper各文字のまたはtolowerバージョンと比較して、比較の数を 2 分の 1 に減らすと、より簡単になります。

于 2013-02-12T03:04:03.937 に答える
2

他の答えがあなたの問題を解決するはずです、私はあなたが1つの全能の関数の代わりに別々の関数を書くことを提案することができますか?

bool IsSpecialChar(char c)
{
 switch(c)
 {
    case 'a':
    case 'A':
    case 'e':
    case 'E':
    case 'i':
    case 'I':
    case 'o':
    case 'O':
    case 'u':
    case 'U':
    return true;
 }
   return false; 
}


int specialCounter(char *strPtr, int &cons)
{
  int vowels = 0;
  cons = 0;
  while (*strPtr != '\0')
  {
    IsSpecialChar(*strPtr) ? vowels++ : cons++;
    strPtr++;

  }
  return vowels;
}
于 2013-02-12T03:10:15.470 に答える
2
while (*strPtr != '/0')

次のようにする必要があります。

while (*strPtr != 0)

また

while (*strPtr != '\0');

コンパイラから警告が表示されませんでしたか? その場合は、警告を無視しないでください。そうでない場合は、より優れたコンパイラを入手してください。

他の比較のエラーに関するコメントも参照してください。

于 2013-02-12T03:04:24.173 に答える