2014-03-08 1 views
-5

Я хотел написать программу на C++, которая проверяет, содержит ли строка каждую букву в алфавите от a до z.Как проверить, содержит ли строка каждую букву в алфавите в C++

+7

Я этого не делаю! Любая попытка? – hivert

+0

Используйте класс std :: string (http://www.cplusplus.com/reference/string/string/) и сделайте снимок. :) – gsamaras

ответ

1
bool allLetters(string s) { 
    vector<bool> checked(255, false); 
    for (int i=0; i < int(s.size()); ++i) 
     checked[s[i]] = true; 
    for (int i='a'; i <= 'z'; ++i) 
     if (!checked[i]) 
      return false; 
    return true; 
} 
+0

Вы должны поставить соответствующий диапазон символов в качестве дополнительных параметров функции, чтобы сделать его более общим (поскольку вы уже собираете информацию для всех возможных значений символов). –

+0

Да, конечно, вы можете обобщить это. (Я знаю, что существуют разные культуры, которые используют разные алфавиты), но идея, я думаю, остается прежней. –

+0

Для чего это стоит, стандарт не гарантирует, что '' a'' ... ''z'' является смежным диапазоном. Это в ASCII, но не в EBCDIC. Таким образом, ваш код отклонил бы «abcdefghijklmnopqrstuvwxyz» на реализацию, которая использовала EBCDIC (если бы вы ее нашли), потому что она не содержит неиспользуемую кодовую точку «138 == ('i' + 1)' или символ ' '± '== (' j '- 1)'. –

0

Предполагая, что набор символов, где буквы являются смежными от А до Я:

bool contains_all_letters(const char * p) 
{ 
    unsigned seen = 0; 
    while (*p) 
    { 
     unsigned c = *p++ - 'a'; 
     if (c < 26) 
     { 
      seen |= (1 << c); 
     } 
    } 
    return seen == (1 << 26) - 1; 
} 
+0

Nitpick: вам нужно учитывать верхний и нижний регистр. Кроме того, переменная 'c' будет иметь нижний поток, если будет введен какой-либо символ, меньший, чем' a'. :-( –

+0

Извините, не понял, что первое утверждение было точным. –

+0

@ThomasMatthews Для символов ниже 'a' вычитание даст отрицательный результат, который будет преобразован в огромный неподписанный результат, который определенно не будет менее 26 :) – fredoverflow

0

Вы всегда можете это сделать (в ASCII)

bool has_alphabet(std::string const &s) 
{ 
    std::bitset<26> alphabet; 
    for (char c : s) { 
     if (c >= 'A' && c <= 'Z') 
      alphabet.set(c - 'A'); 
     else if (c >= 'a' && c <= 'z') 
      alphabet.set(c - 'a'); 
    } 
    return 26 == alphabet.count(); 
} 

Вы должны включить bitset заголовок и независимо от того, находятся ли крышки до или после нижних букв или у них есть другие символы между ними, это будет работать

Смежные вопросы