Отдельный вывод букв, цифр, и спец символов

93
05 октября 2019, 02:00

Задача состоит в том, что бы программа принимала строку, и по отдельности выводила в разные строки её буквы(абвгд и тд.), цифры(1234) и спец символы(*,/,+,- и тд.) Например строка "Привет-Я-Агент-007" выводилась как: "ПриветЯАгент","---","007". Проблема похоже в самом алгоритме, так как программа не всегда работает корректно, помогите пожалуйста решить проблему. Насчет вывода в конце кода - не обращайте внимание, я потом сам его создам, главное что бы программа работала правильно, а в моем случае некоторые символы пропадают или вообще выводятся новые, несуществующие.

#include <string>
#include <iostream>
using namespace std;
int main ()
{  
string Str="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
string Chars="!@#$%^&*()_+-/.<>";
string Numbers="1234567890";
string inputStr;
cin>>inputStr;
for (int i=0;i<=inputStr.length();i++)
{
  for(int j=0;j<=inputStr.length();j++)
  {
      if (inputStr[i]==Str[j]) cout<<Str[j];
      else if (inputStr[i]==Chars[j]) cout<<Chars[j];
      else if (inputStr[i]==Numbers[j]) cout<<Numbers[j];
  }
}
}
Answer 1

Для таких целей стандартная библиотека предоставляет альгоритмы разделители, и задача легко решается (два вызова std::partition_copy). Я захотел продемонстрировать побольше альгоритмов_разделителей, поэтому пошел путем чуть посложнее:

using namespace std;
string inputStr, digits, alpha, space;
cin >> inputStr;
// разделяем буквы и цифры от других символов с копированием в строки
partition_copy(inputStr.begin(), inputStr.end(),
               back_inserter(digits), back_inserter(space),
               [](char c) { return isalnum(c); });
// теперь в space символы, которые и не буквы и не цифры
//а в digits все буквы и цифры
// разделяем  цифры от букв
auto op = [](char c) { return isdigit(c); };
partition(digits.begin(), digits.end(), op);
//находим позицию разделения
auto pos = partition_point(digits.begin(), digits.end(), op);
//копируем от этой позиции, получаем буквы
copy(pos, digits.end(), back_inserter(alpha));
//Буквы тоже готовы. Удаляем все элементы не цифры, и остаются цифры
digits.erase(pos, digits.end());
std::cout << inputStr << endl
          << digits << endl
          << alpha << endl
          << space << endl;
Answer 2

Ваша программа, если и сработает правильно, выведет просто исходную строку без изменений.

  1. Если следовать вашему алгоритму(если я его правильно понимаю), вам потребуется не 1 цикл(по i), а 3: в 1ом выводите только буквы, во втором символы, и в последнем цифры.
  2. Во вложенном цикле следует изменять j не до inputStr.length(), а до Str/Chars/Numbers.length(). В зависимости от того, какую группу символов(буквы,символы или цифры) вы в данный момент выводите.

А для проверки символов куда удобнее пользоваться isalpha/isdigit и прочими стандартными функциями

Answer 3
int main ()
{
string Str;
string Chars;
string Numbers;
string symbol = "!@#$%^&*()_+-/.<>";
string inputStr;
getline(cin, inputStr);
for (size_t i = 0; i < inputStr.size(); i++) {
    if (isspace(inputStr[i]))
        continue;
    if (isdigit(inputStr[i]))
        Numbers.push_back(inputStr[i]);
    else if (isalpha(inputStr[i]))
        Str.push_back(inputStr[i]);
    else if (symbol.find(inputStr[i]))
        Chars.push_back(inputStr[i]);
}
std::cout << Str << ',' << Chars << ',' << Numbers;
}
READ ALSO
Передача Bitmap между процессами?

Передача Bitmap между процессами?

У меня есть два процесса Client и Server, один из них генерирует Bitmap мне нужно его передать другому процессуЯ создал между ними FileMapping

111
Drag &amp; Drop в QAbstractItemModel

Drag & Drop в QAbstractItemModel

Не могу разобраться в том, как работает drag & drop в qt-ишной model-viewМне нужно реализовать перетаскивание между двумя view (QTreeView) в которых находятся...

125
Запретить редактирование JTable [закрыт]

Запретить редактирование JTable [закрыт]

Нужно запретить редактирование JTable, чтобы при нажатие на конкретную строку она только выделялась и можно было обработать слушателем это...

108
return не возвращает значение [закрыт]

return не возвращает значение [закрыт]

Не могу понять почему метод say(String something) не возвращает "Ты чё не знаешь, что рыбы не разговаривают?"

122