Если бы я делал это, я думаю, что сделал бы работу немного по-другому.Если вы можете позволить себе игнорировать мэйнфреймы IBM, я бы сделал что-то вроде этого:
unsigned long bitset = 0;
char *arr = "saaangeetha";
char *pos;
for (pos=arr; *pos; ++pos)
if (isalpha(*pos))
bitset |= 1 << (tolower(*pos)-'a');
Это связывает один бит в bitset
с каждой возможной буквой.Затем он проходит по строке и для каждой буквы в строке устанавливает соответствующий бит в bitset
.Чтобы распечатать буквы, как только вы закончите, вы должны пройти через набор битов и распечатать соответствующую букву, если этот бит был установлен.
Если вы заботитесь о мэйнфреймах IBM, вы можете добавить небольшую таблицу поиска:
static char const *letters = "abcdefghijklkmnopqrstuvwxyz";
и используйте strchr
, чтобы найти правильную позицию для каждой буквы.
Редактировать: Если вы используете C ++, а не C (как сказал тег, когда я писал, чтовыше), вы можете немного упростить код за счет использования некоторого дополнительного хранилища (и, возможно, чуть более медленного):
std::string arr = "saaangeetha";
std::set<char> letters((arr.begin()), arr.end());
std::copy(letters.begin(), letters.end(), std::ostream_iterator<char>(std::cout, " "));
Обратите внимание, что, хотя они и выглядят одинаково для тестового ввода,они могут вести себя по-разному - предыдущая версия выводит на экран все, кроме букв (и преобразует их все в нижний регистр), но это отличает верхний регистр от нижнего и также показывает все не алфавитные символы в выводе.