删除重复字符(水嫩嫩的妹子,求C/C++编程大神啊)

作者&投稿:善琴 (若有异议请与网页底部的电邮联系)
一道关于删除文本中重复内容的编程题,求教c/c++大神!!!~

void SplitStringByMark(const std::string& strString, char cMark, std::vector& vecString){std::string strStrIn = strString;for (int nPos = 0; nPos 0x80) //汉字{nPos++;continue;}if (cMark == strStrIn[nPos]){std::string strDiv = strStrIn.substr(0, nPos);strStrIn = strStrIn.substr(nPos+1, strStrIn.size() - nPos - 1);vecString.push_back(strDiv);nPos = -1;}}if (!strStrIn.empty()){vecString.push_back(strStrIn);}}int _tmain(int argc, _TCHAR* argv[]){string strSource = "ab=123|bc=234|cd=345|dc=456";vector vecSplit;SplitStringByMark(strSource, '|', vecSplit);map mapString;vector::iterator iterStr = vecSplit.begin();for (; iterStr != vecSplit.end(); ++iterStr){vector vecStrInfo;SplitStringByMark(*iterStr, '=', vecStrInfo);if (2 != vecStrInfo.size()){cout(vecStrInfo.at(0), vecStrInfo.at(1)));}string strIn = "";cout>strIn){if (mapString.count(strIn)){cout>strIn;if (strIn == "y"){break;}cout<<"请输入要查找的字符串:"<<endl;}}system("PAUSE");return 0;}

第二个问题:我有一个十分垃圾的办法,只能用于你这种文本内容十分少的情况,多了就不行了。我也不了解真正的文本编译器是如何实现的,如果你找到了资料希望能给我分享一下。
#include #define MAXBUFERSIZE 1024int _tmain(int argc, _TCHAR* argv[]){ifstream inStream;inStream.open("D:\\123.txt");if (!inStream.is_open()){cout vecLineInfo;char buffer[MAXBUFERSIZE];while(inStream.getline(buffer, MAXBUFERSIZE)){vecLineInfo.push_back((string)buffer);}inStream.close();sort(vecLineInfo.begin(), vecLineInfo.end());vecLineInfo.erase(unique(vecLineInfo.begin(), vecLineInfo.end()), vecLineInfo.end());ofstream outStream;outStream.open("D:\\123.txt");for (unsigned int i = 0; i < vecLineInfo.size(); ++i){outStream<<vecLineInfo.at(i)<<endl;}outStream.close();return 0;}

程序的基本思路是把输入的字符串放到a[100]字符组中,然后把a[100]中所有不重复的字符添加到b[100]中,间接完成对字符串中的重复字符的删除


#include
void main()
{
char a[100],b[100];
//定义两个字符组,a[100]用来接收输入的字符串,b[100]用来存储不重复的字符
int pa=0,pb=0,i,flag;
scanf("%s",a);
//输入字符串到a[100]中,用scanf读入到a[100]中会自动在a[100]中字符串结束的地方加上'\0'
for(pa=0;a[pa]!='\0';pa++)
//for循环结束的条件是a[pa]==0,也就是从a[100]字符组中读取一个字符,直到没有
{
flag=1;
//flag是个标志符,当flag==1时,说明这个字符(下句中的a[pa])是第一次出现,应该加入到b[100]中
//如果flag==0,说明这个字符(下句中的a[pa])重复了,不应该加到b[100]中
for(i=0;i<pb;i++) if(b[i]==a[pa]) flag=0;
//把a[100]中读取的字符a[pa]与b[100]中的所有字符进行比较,如果b[i]==a[pa]
//说明这个字符已经在b[100]中了,也就是重复字符了,所有将flag=0,不能加入b[100]中
//如果a[pa]与b[100]中的所有字符都不相等,说明这个字条是第一次出现,应该加到b[100]
if(flag)
{
b[pb]=a[pa];pb++;
}
//如果flag==1,则将a[pa]这个字符加入到b[100]中,然后将pb加1
}
b[pb]='\0';
//当所有的不重复的字符都加入到b[100]中时,将b[100]中字符结束的地方加'\0',也就是b[pb]='\0'
//因为字符串都是民'\0'结尾的,所以加上这句
printf("%s
",b);
//输出b[100]中的字符串,也就是删除过重复字符之后的了
}

请问 int GetResult(const char *input, char *output) 这个函数原型声明是题目要求的,还是你自己设计的?

如果你采用C语言实现这样一个功能,我认为这个声明其实是不合理的,应该这样声明这个函数:
int GetResult(const char *input, int n1, char *output, int n2);
需要用参数来指明输入输出字符串可能的最大长度,用来做边界检查。

如果是题目规定按照 int GetResult(const char *input, char *output) 这样声明这个函数,那么你的函数存在以下几个问题:
1:if(input[0]==0 || input==NULL) return -1;
在这句中,试想如果 input == NULL,那么你还能判断 input[0]==0 吗?因为在你的if语句中input[0]==0 会比 input == NULL 先判断,所以当input == NULL成立的时候,input[0]==0会出错。

2:你没有判断 output == NULL 的情况,你只对输入缓冲区做检查,还应该对输出缓冲区检查。

3:你甚至应该对input 和 output地址大小作检查,你比如我这样调用你的函数,你觉得会怎样?
char s[] = "12345678";
GetResult(s, s+8);

我不知道华为的测试系统是如何检测你的函数的,但是如果你的函数真的是拿去商用的话,在使用者不知情的情况下随意调用,真的是安全的吗?

int GetResult(const char *input, char *output)
{
//1. 函数设计思想 建立缓存数组
//2. 一个判断数组就是一个循环
//3.一个缓存数组就是一个检索循环
//4. 合格的写入短字符检索缓存中
//5. 完成后写入给定 output

//1.
char buff[2048]="";
char * A =(char *)input;
//2.
do
{
char *C = buff;
bool byes = true;
//3.
while(*C != 0)
{
if(*C++ ==*A )
byes = false;
}
//4.
if(byes)
{
while(*C!=0){C++;}
*C = *A;

}

} while (*A++ != 0);

//5.
char *D = buff;
int Len = 0;
while( *output++ = *D++)
Len++;

return Len;
}

int main()
{
char pp[1280];
GetResult("qweqwe123123zxcv",pp);
printf(pp);
system("pause");
}
// 这是我写的一份 纯c++的
// 你也可以用 string 来一套
// 希望可以帮助你! 复制可调试

字符串结尾不是'\0'吗?

你改下
if(input[0]==0 || input==NULL) -> if(input[0]=='\0' || input==NULL)

output[k]=0; -> output[k]='\0';

for(i=0;input[i]!=0;i++) -> for(i=0;input[i]!='\0';i++)

看看对不对

if(input[0]==0 || input==NULL) 改为 if( input==NULL || output==NULL || input[0]==0 )

char *和char []初始化的问题吧


删除重复字符(水嫩嫩的妹子,求C\/C++编程大神啊)
如果你采用C语言实现这样一个功能,我认为这个声明其实是不合理的,应该这样声明这个函数:int GetResult(const char *input, int n1, char *output, int n2);需要用参数来指明输入输出字符串可能的最大长度,用来做边界检查。如果是题目规定按照 int GetResult(const char *input, char *output) 这...

谁知道如何辨别兰芝真伪?
1、LOGO标志 正品包装盒内部兰芝的LOGO是呈凸起状的,字迹清楚工整。而假的LOGO是呈平状的,字体模糊不工整。2、编号 正品正面是编号,反面是日期版。而假货正面什么都没有,反面是编号。3、喷码 正品喷码粗墨喷印,印的是EXP日期且字体粗。而假货的是点墨喷印,只有编号没标注EXP日期且字体较细。4...

卸妆油和卸妆膏哪个好
具体看你肤质跟化妆的厚薄。卸妆油卸妆快,卸得更干净尤其是画彩妆的时候,基本上适合所有肤质推荐DHC的橄榄油,我自己用了两年了哈;卸妆膏质地要温和一些,也比较容易清洗,平时画个裸妆什么的也就够了,所以具体还是要看你自己的肤质跟化什么妆。1.卸妆油卸妆原理:以油溶油优点:卸妆力较强缺点:...

民和回族土族自治县18246004084: 求C语言代码,删除字符串中重复字符
宫宜复方: #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; int main() { std::string str = "aabbcc"; std::cout &lt;&lt; "Before: " &lt;&lt; str &lt;&lt; std::endl; str.erase(std::unique(str.begin(), str.end()), str.end()); std::cout &lt;&lt; "After: " &lt;&lt; str &lt;&lt; std::endl; return 0; }

民和回族土族自治县18246004084: C语言 删除重复字符 -
宫宜复方: 程序的基本思路是把输入的字符串放到a[100]字符组中,然后把a[100]中所有不重复的字符添加到b[100]中,间接完成对字符串中的重复字符的删除#include<stdio.h> void main() { char a[100],b[100]; //定义两个字符组,a[100]用来接收输入的字...

民和回族土族自治县18246004084: c语言,删除字符串中的重复字符. -
宫宜复方: 1)肯定要加return j,因为 int fun(int a[], int n)函数完成的功能是把无重复的数放到数组0到j.2)图片说明如下:

民和回族土族自治县18246004084: c++编程:输入一串字符,删除该串字符中所有的与给定字符相同的字符.要求:用函数完成 -
宫宜复方: 没错,他是只能接收一个字符,但是因为你是在while里面循环,如果但他没有收到换行符时,他是会不断接收下一个字符的. while((c=getchar())!='\n') //就是这个换行符{ } 如果你想验证我的说你可以把上面的代码改成这样,当你输入3时他就不会收下个字符了. while((c=getchar())!=3) //就是这个换行符{ }

民和回族土族自治县18246004084: c语言,去除字符串中重复的字母,求助~ -
宫宜复方: #include "stdafx.h" #include "stdio.h" int _tmain(int argc, _TCHAR* argv[]) {#define size 1000void deleteRepeats(char []);char message[size];printf("Please enter a sentence:\n");gets(message);deleteRepeats(message);return 0; } 看你上面,你建的工程有问题,弄一个普通的win32控制台程序即可,不要mfc这些东西.注:mfc是微软针对windows窗口编程提供的类库集合.

民和回族土族自治县18246004084: 求大神!怎么用c语言删除字符串里的重复字符比如输入aa++////9输出aa+/9(字母和数字可以 -
宫宜复方: 参考代码如下:#include <stdio.h> #include <string.h> int GetResult(const char *input, char *output) {int i, j, k = 0;int flag;int length;//判断输入和输出数组是否有值if(input == NULL || output == NULL){return -1;}length=strlen(input);//求数组...

民和回族土族自治县18246004084: 编写一函数把字串中与某字符相同的字符删除,主函数如下,C++如何编写呢? -
宫宜复方: void fun(str,c) { for (i=0;str[i]!='\0';i++) { int j; if(str[i]==c) { j=i; while(str[j]!='\0'){ str[i]=str[+i];j++; } } } }

民和回族土族自治县18246004084: 求C语言代码,删除字符串中重复字符 如输入"aabbcc",要求输出"abc"
宫宜复方: 字符也可以使用整数来表示,其实整数0-255用%c来输出就是字符.#include int main() {char s[256]; /*初始化了一个数组来存放输入的串*/ int i = 0, tmp[256] = {0}; /*tmp是一个256个整型数组,初始化成全0*/printf("Enter the string :\n");gets(...

民和回族土族自治县18246004084: C语言去掉重复字符再排序 -
宫宜复方: char a[30] = "qweasdzxcvbnhbgfvredcxswqazx"; for (int i = 0; i < 30; i++) { printf("%c",a[i]); for (int j = 0; j < i; j++) { if (a[i] == a[j]) { a[i] = '0'; } } }printf("\n"); for (int i = 0; i< 30; i++) { if (a[i] != '0') { printf("%c",a[i]); } } 用两个for循环,将字符串...

民和回族土族自治县18246004084: c语言 去掉数组中重复的元素····求帮助 -
宫宜复方: 说的不是很清楚,数组定义的时候就删除?看来你对数组的操作还不是很清楚,应该是在数据写入数组的时候将其删除吧.你可以这样,如果数组不大,在写入数据的时候先遍历一遍数组看看数组中是否有该数据,如果有那么就不把数据写入数组,如果没有就接着最后一个元素写入数组就可以了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网