Проверьте, содержит ли строка не алфавитно-цифровой символ

Я пытаюсь написать функцию, которая принимает строку в качестве аргумента и проверяет, является ли эта строка содержит только один не буквенно-цифровой символ, если это так, верните true, если нет — false.

Например:

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

Мой текущий код ниже, но я не чувствую, что он работает. Поскольку у меня есть счет в другом месте, который в основном считает истины. Готово с использованием карты, которая содержит строки. И значение, которое я получаю за счет, слишком велико для вводимых слов.

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

0

Решение

Вы не считаете количество не буквенно-цифровых символов в вашем коде? вы просто возвращаете true или false в первом символе.

Если не считать, вы не найдете ответ. Тем не менее, вы можете остановиться на втором не alphanum.

Поскольку вам, кажется, нужно упражнение при написании кода, вот некоторый псевдо-код:

int nonalphas = 0;
for ( char in string )
if ( char is nonalpha )
nonalphas++;
if ( nonalphas > 1 )
break;
return nonalphas == 1;
-4

Другие решения

Ты можешь использовать std::count_if и затем проверьте, больше ли значение, чем 1.

int i = std::count_if(str.begin(),str.end(),[](char c){ return !(std::isalnum(c)); });
return i > 1;
5

Ваша программа принимает решение после просмотра только одного символа; это не может работать так! Когда вы видите, что символ буквенно-цифровой, вы возвращаете false сразу, не глядя на оставшихся персонажей. Чтобы исправить, переместите return false вне петля.

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;
}
3

Вы могли бы использовать 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;
}
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;
}

Предостережение заключается в том, что этот алгоритм проверяет все символы в строке. Это может или не может быть проблемой производительности.

2

Такой же «неэффективный», как и следующий парень.

#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());
}

Размещено только для того, чтобы я тоже мог получить отрицательное голосование по причинам «это не так, как я бы это сделал». Я лучше буду смеяться с грешниками, чем плакать со святыми.

2
По вопросам рекламы [email protected]