2017-09-28 6 views
0

文字列内の特定の文字をチェックするのが難しいです。この関数の必要条件は、 ""の文字がすべて小文字、空白、句読点( ';'または '、'のみ)であることを確認することです。また、最後のC-ストリング内の文字は!またはa。特定の文字を確認する

ここに私のものがあります。

bool isItSentence(const char* s) 
{ 
    int x = strlen(s); 


    for (int c = 0; s[c] != '\0'; c++) 
    { 
     if (!isupper(s[0])) return false; 
     if (isupper(s[c]) && c > 0) return false; 
     if (s[c] != ' ' && s[c] != ';' && s[c] != ',' && !islower(s[c])) return false; 

    } 

    if (s[x - 1] != '.' && s[x - 1] != '!') return false; 
    return true; 
} 
int main() 
{ 
    std::string str = "Smelly."; 


    std::cout << isItSentence(str.c_str()) << std::endl; 
    system("pause"); 

} 

しかし、私は、文章ではなく、文章でなければならないということを続けています。どのように私はこれを修正することができます上の任意の提案?

答えて

0

インデックス0からループして最初の文字を大文字にし、後のステートメントで小文字であることを再度確認していることを確認しているため、問題が発生しているようです。

if (!isupper(s[0])) return false; 

以降

if (s[c] != ' ' && s[c] != ';' && s[c] != ',' && !islower(s[c])) return false; 

最初の繰り返しの間に、cが0に等しいとき、あなたは基本的に最初の文字が大文字でも小文字あってはならないどちらことを確認され、これらのいずれかが常にするので、あなたはfalseを取得偽です。次のコードはそれを行う必要があります。

bool isItSentence(const char* s) 
{ 
    int x = strlen(s); 
    if (!isupper(s[0])) return false; 
    if (s[x - 1] != '.' && s[x - 1] != '!') return false; 
    for (int c = 0; c < x - 1; c++) 
    { 

     if (isupper(s[c]) && c > 0) return false; 
     if (s[c] != ' ' && s[c] != ';' && s[c] != ',') 
     if(!islower(s[c]) && c!= 0) 
     return false; 

    } 
    return true; 
} 
int main() 
{ 
    std::string str = "Smelly."; 
    std::cout <<" This is "<<isItSentence(str.c_str()) << std::endl; 
    system("pause"); 
} 

希望すると助かります!

関連する問題