Другой подход состоит в том, чтобы просто обрабатывать каждый ввод как строку, и l oop над каждым символом в строке, подтверждая, что он является di git и равен предыдущему символу. Если он не проходит ни одного теста, то прочитанное не является целым числом со всеми равными цифрами.
Например, вы можете сделать:
#include <iostream>
#include <sstream>
#include <string>
#include <cctype>
int main (void) {
int main (void) {
std::string s;
std::stringstream ss { "1 11 1111 foo 2222\nbar 1212\n4444\n8888\n4567\n"
"3433333 a8\n9999999999999999999\n" };
while (ss >> s) { /* read each string */
bool equaldigits = true; /* flags equal digits */
for (size_t i = 1; i < s.length(); i++) /* loop 1 - length */
/* validate previous & current digits & equal */
if (!isdigit(s[i-1]) || !isdigit(s[i]) || s[i-1] != s[i]) {
equaldigits = false; /* if not set flag false */
break; /* break loop */
}
/* handle empty-string or single char case */
if (!s.length() || (s.length() == 1 && !isdigit(s[0])))
equaldigits = false;
if (equaldigits) /* if all digits & equal */
std::cout << s << '\n'; /* output string */
}
}
Приведенный выше std::stringstream
просто обеспечивает симулированный ввод для программы.
( примечание: вы можете l oop с std::string::iterator
, если хотите, или использовать диапазоны for
l oop и prev
char для хранения последнего увиденного. Здесь также легко выполнить итерации по индексам)
Использование std :: string find_first_not_of
Использование существующих строковых функций обеспечивает другой способ. После сравнения того, что первый символ является ди git, вы можете использовать std :: basic_string :: find_first_not_of , чтобы просканировать остальную часть строки на наличие символа, который не совпадает с первым - если результат не равен std::string::npos
, то ваша строка не совпадает с di git.
#include <iostream>
#include <sstream>
#include <string>
#include <cctype>
int main (void) {
std::string s;
std::stringstream ss { "1 11 1111 foo 2222\nbar 1212\n4444\n8888\n4567\n"
"3433333 a8\n9999999999999999999\n" };
while (ss >> s) { /* read each string */
if (!isdigit(s.at(0))) /* 1st char digit? */
continue;
/* if remainder of chars not equal 1st char - not equal digits */
if (s.find_first_not_of(s.at(0)) != std::string::npos)
continue;
std::cout << s << '\n';
}
}
Оба подхода дают один и тот же вывод.
Пример Использование / Вывод
$ ./bin/intdigitssame
1
11
1111
2222
4444
8888
9999999999999999999
Есть много других способов сделать это, как показывают другие хорошие ответы. Стоит понимать каждый подход.