我正在尝试做一些数组操作。 我在这里做char数组排序和重复删除。 欢迎您的意见。虽然没有在这里做过很多测试和错误处理。
#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);
}
答案 0 :(得分:6)
如果您使用std::string
,您的代码(实际上是C风格)可以用以下几行用C ++ Style编写:
#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
如果你想要char*
,那么你可以这样做:
const char *uniqueChars = s.c_str(); //after removing the duplicates!
答案 1 :(得分: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(正如我在上面写的那样时标记所说的那样),您可以稍微简化代码,但代价是使用一些额外的存储空间(可能会慢得多):< / p>
std::string arr = "saaangeetha";
std::set<char> letters((arr.begin()), arr.end());
std::copy(letters.begin(), letters.end(), std::ostream_iterator<char>(std::cout, " "));
但是,请注意,虽然这些对于测试输入看起来是相同的,但它们的行为可能不同 - 之前的版本除了字母之外都会屏蔽掉任何内容(并将它们全部转换为小写),但这可区分大写和小写,并显示输出中的所有非字母字符。
答案 2 :(得分:1)
char *arr = "saangeetha";
arr
指向只读部分,其中存储了字符串文字saangeetha
。因此,它无法修改,并且是访问冲突错误的原因。相反,你需要做 -
char arr[] = "sangeetha"; // Now, the string literal can be modified because a copy is made.