#include <iostream>
using namespace std;
int main(){
string s,str;
cin>>s;
int a[26]={0};
for(int i=0;i<26;i++){
int x=(int)s[i]-97;
if(a[x]==0){
a[x]++;
str+=s[i];
}
}
cout<<str<<endl;
return 0;
}
输入:geeksforgeeks
输出:geksfor �
这是我得到一些额外字符作为输出的地方,为什么我会这样? 谁能帮我 ? 提前致谢。
最佳答案
你的循环在 [0, 26)
范围内以 i
运行,其中 i
正在索引 s
,无论 s
的长度如何(在这种情况下,s
比 26 个字符长很多)。最终,您在 s
的边界之外进行索引(调用未定义的行为)并开始处理乱码,并且您的代码开始将独特的乱码推送到结果字符串中。如果您可以假设您的输入始终是小写 ASCII,则可以在 [0, s.size())
范围内使用 i
进行迭代(或使用 C++11 for- each style looping without indexing at all), 但如果 str
达到 26 的长度(因为所有 26 个唯一字符都已被看到),则短路。
一种方法:
int main(){
string s,str;
cin>>s;
int a[26]={0};
for(auto c : s){
int x = c-97;
if (a[x] == 0) {
a[x]++;
str += c;
if (str.size() == 26) break;
}
}
cout<<str<<endl;
return 0;
}
关于c++ - 为什么我的用于删除重复字符的 c++14 程序在输出中给出了额外的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160426/