0

文字列を引数として取り、その文字列に英数字以外の文字が 1 つしか含まれていないかどうかをチェックする関数を作成しようとしています。その場合は true を返し、そうでない場合は false を返します。

例えば:

'Alex's' would return true. 
James..Warner would return false.

私の現在のコードは以下のとおりですが、機能しているとは思いません。私は他の場所にカウントを持っているので、基本的にtrueをカウントします。文字列を含むマップを使用して実行します。そして、カウントに対して取得している値は、入力されている単語に対して高すぎます。

bool Class3::filter(string word)
    {
        string s = word;
        int len = s.size();

        for (int i=0; i<len; i++)
        {   if(!isalnum(s[i])){
            return true;}
            else{return false;}  
        }
     }
4

7 に答える 7

6

を使用std::count_ifして、値が1より大きいかどうかを確認できます。

int i = std::count_if(str.begin(),str.end(),[](char c){ return !(std::isalnum(c)); });
return i > 1;
于 2013-01-13T22:45:51.887 に答える
3

あなたのプログラムは、1 文字だけを見て決定を下します。そのようには機能しません!文字が英数字であることがわかるとfalse、残りの文字を見ずにすぐに戻ります。修正するには、ループのreturn false 外側に移動します。

于 2013-01-13T22:43:34.737 に答える
3

他の人は、あなたが自分の問題をどれほどひどく説明したかについてコメントし、おそらく理解していない複雑なテンプレート ベースのコードを投げかけました。よく読んでおくことを強くお勧めします。テンプレートは強力で便利な優れたプログラミング手法です。欠点は、最初にそれらを学ばなければならないことです。

非テンプレート指向のソリューションは次のとおりです。

bool class3::filter(string word)
{
    //You aren't mutating word, so don't waste your time
    //(or memory) by copying it.  In fact, I'd (strongly)
    //recommend you utilize a constant pass by reference,
    //because by default that's what you're already doing,
    //so you were taking a copy of a copy.  Waste of memory!

    //Just init a count variable.
    int count=0;

    //Set up your for loop...
    for(int i=0; i<word.size(); i++)
    {
        if(!isalnum(word[i]))
        {
            //If a character doesn't match, increment your counter
            count++;
                            //If you want to, you can return false here if count>1 to improve efficiency -- depends on your end goal.
        }
    }
    //If you want exactly one non-alphanumeric, then return this.
    return count==1;
    //Or if it's a maximum of one non-alphanumeric, then...
    return count<=1;
    //Or you could generalize by returning a count of non alphanumerics -- remember to change the return type!
    return count;
}
于 2013-01-13T23:00:44.843 に答える
3

次の男と同じくらい「非効率的」です。

#include <string>
#include <algorithm>
#include <functional>
#include <cctype>

// return 'true' if there is one-and-only-one non-alphanumeric character
// in the given std::string parameter. If there are NO non-alphanumeric
// characters, OR more than one, then return 'false'.
bool filter(const std::string& s)
{
    function<bool(char)> is_not_alnum([](char c)->bool{ return !isalnum(c); });
    string::const_iterator first = find_if(s.begin(), s.end(), is_not_alnum);
    return first != s.end() && (find_if(first+1, s.end(), is_not_alnum) == s.end());
}

私も「それは私がやる方法ではない」という理由で反対票を投じられるように投稿されました。聖人と泣くより、罪人と笑いたい。

于 2013-01-13T23:41:47.837 に答える
2

std::count_ifと組み合わせてお使いいただけますstd::isalnum

bool filter(const std::string word)
{
  return std::count_if(word.begin(), word.end(), [](char c){ return !(std::isalnum(c));}) > 1;
}

注意点は、このアルゴリズムが文字列内のすべての文字をチェックすることです。これは、パフォーマンスの問題である場合とそうでない場合があります。

于 2013-01-13T22:44:52.617 に答える
2

std::count_ifとを使用できますlambda

bool filter(const std::string& s)
{
  if (std::count_if(s.begin(), s.end(), [](char c){ return !std::isalpha(c); }) == 1)
  {
    cout << s << ": contains one non-alpha charectors" << endl;
    return false;
  }

 cout << s << ": string contains alpha charectors only" << endl;
 return true;      
}
于 2013-01-13T22:51:03.177 に答える
-4

コード内の英数字以外の文字の数を数えていませんよね? 最初の文字で true または false を返すだけです。

数えなければ答えは見つからない。ただし、2 番目の非英数字で停止できます。

コードを書くには演習が必要なようですので、ここにいくつかの疑似コードを示します。

int nonalphas = 0;
for ( char in string )
    if ( char is nonalpha )
        nonalphas++;
        if ( nonalphas > 1 )
            break;
return nonalphas == 1;
于 2013-01-13T22:43:47.607 に答える