Сортировка массива Char и удаление дубликатов - PullRequest
0 голосов
/ 22 марта 2011

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

#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#include<string>
using namespace std;

void sort(char *& arr)
{
    char temp;
    for(int i=0;i<strlen(arr);i++)
    {
        for(int j=i+1;j<strlen(arr);j++)
        {
            if(arr[i] > arr[j])
            {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            }
        }
    }

}
bool ispresent(char *uniqueArr, char * arr)
{
    bool isfound = false;
    for(int i=0;i<strlen(arr);i++)
    {
    for(int j=0;j<=strlen(uniqueArr);j++)
    {
        if(arr[i]== uniqueArr[j])
        {
        isfound = true;
        return isfound;
        }
        else
        isfound = false;
    }
    }

    return isfound;
}

char * removeduplicates(char *&arr)
{
    char * uniqqueArr = strdup(""); // To make this char array modifiable
    int index = 0;
    bool dup = false;
    while(*arr!=NULL)
    {       
     dup = ispresent(uniqqueArr, arr);
     if(dup == true)
     {}//do nothing
     else// copy the char to new char array.
     {
           uniqqueArr[index] = *arr;    
     index++;
     }
    arr++;
    }
    return uniqqueArr;
}
int main()
{
    char *arr = strdup("saaangeetha"); 
    // if strdup() is not used , access violation writing to 
          //location occurs at arr[i] = arr[j]. 
    //This makes the constant string modifiable
    sort(arr);
    char * uniqueArr = removeduplicates(arr);   

}

Ответы [ 3 ]

6 голосов
/ 22 марта 2011

Если вы используете std::string, ваш код (который на самом деле является C-Style) может быть написан в стиле C ++ только в следующих строках:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
        std::string s= "saaangeetha";
        std::sort(s.begin(), s.end());
        std::string::iterator it = std::unique (s.begin(), s.end()); 
        s.resize( it - s.begin());
        std::cout << s ;
        return 0;
}

Вывод: (все дубликаты удалены)

aeghnst

Демо: http://ideone.com/pHpPh

Если вы хотите char* в конце, то вы можете сделать это:

   const char *uniqueChars = s.c_str(); //after removing the duplicates!
2 голосов
/ 22 марта 2011

Если бы я делал это, я думаю, что сделал бы работу немного по-другому.Если вы можете позволить себе игнорировать мэйнфреймы 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, " "));

Обратите внимание, что, хотя они и выглядят одинаково для тестового ввода,они могут вести себя по-разному - предыдущая версия выводит на экран все, кроме букв (и преобразует их все в нижний регистр), но это отличает верхний регистр от нижнего и также показывает все не алфавитные символы в выводе.

1 голос
/ 22 марта 2011
char *arr = "saangeetha";

arr указывает на секцию только для чтения, где хранится строковый литерал saangeetha.Таким образом, он не может быть изменен и является причиной ошибки нарушения доступа .Вместо этого вам нужно сделать -

char arr[] = "sangeetha"; // Now, the string literal can be modified because a copy is made.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...