【问题标题】:Char array sorting and removing duplicatesChar 数组排序和删除重复项
【发布时间】:2011-03-22 18:59:00
【问题描述】:

我正在尝试进行一些数组操作。 我在这里进行字符数组排序和重复删除。 欢迎您的 cmets。不过这里没有做太多的测试和错误处理。

#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);   

}

【问题讨论】:

  • 为什么为什么要char*?为什么为什么不std::stringstd::vector
  • @user457660:阅读我的评论,这是我为回应您的解决方案而写的!
  • @user457660:受此主题的启发,我创建了另一个讨论一些事情的主题。这是链接:stackoverflow.com/questions/5397616/what-is-wrong-with-stdset

标签: c++ arrays


【解决方案1】:

如果您使用std::string,您的代码(实际上是 C 风格)可以用 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!

【讨论】:

  • +1 表示std::string。 @user 如果您使用的是 c++,为什么不使用 STL?它的存在是为了让它更容易,而不必重新发明轮子。 (这是当然的,除非你有 char * 要求)
  • @Nawaz,我也会按照您在我的工作中建议的方式进行操作。但我正在努力学习这里的概念,所以想亲自动手使用 char *,自己排序和复制。
  • @user457660:好的。在这种情况下,我认为char * uniqqueArr = strdup("") 是不正确的,因为它没有按您的需要分配内存。最好这样做:char * uniqqueArr = new char[strlen(arr)];。这样你就可以写uniqqueArr[index] where index &lt; strlen(arr).
  • @user457660:受此主题的启发,我创建了另一个讨论一些事情的主题。这是链接:stackoverflow.com/questions/5397616/what-is-wrong-with-stdset
【解决方案2】:

如果我这样做,我想我会以完全不同的方式完成这项工作。如果您有能力忽略 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 中的相关位。完成后要打印出字母,您需要遍历 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, " "));

但是请注意,虽然这些对于测试输入看起来相同,但它们的行为可能有所不同——以前的版本会屏蔽除字母以外的任何内容(并将它们全部转换为小写),但这区分了大写和小写,并在输出中显示所有非字母字符。

【讨论】:

  • “如果您有能力忽略 IBM 大型机”和某些现代 DSP。
  • @Steve:哪个 DSP 会使用字母不连续的字符集?
  • 对不起,我很愚蠢,我完全误解了你在说什么。我认为那里也有关于字节大小的假设,但现在你提到它我很确定字母表中仍然有 26 个字母。
  • @Steve Jessop:是的——IBM 大型机上的问题是,在 EBCDIC 中还有其他字符卡在字母表的中间(嗯,不完全是中间,而是在两个位置,~1 /3rd 和 2/rds 的方式),这可以摆脱索引等。
【解决方案3】:
char *arr = "saangeetha";

arr 指向存储字符串文字saangeetha 的只读部分。因此,它不能被修改并且是访问冲突错误的原因。相反,您需要这样做 -

char arr[] = "sangeetha"; // Now, the string literal can be modified because a copy is made.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2012-03-10
    • 2011-02-09
    • 2021-11-12
    • 2021-01-27
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多