c++ - 为什么我的用于删除重复字符的 c++14 程序在输出中给出了额外的字符?

标签 c++ string hash c++14

#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/

相关文章:

Swift double 到字符串

python - 如何在没有 eval 的情况下取消列表/元组的字符串

hash - 加盐您的密码 : Best Practices?

Perl grep 嵌套哈希递归

ruby-on-rails - ruby 中的破解如何访问转换为哈希的 JSON 中的数据?

c++ - 前向声明中的 "using typedef-name ... as class"

c++ - 什么用: Ipl?或者Mat?

python - 在python中的匹配对象中查找字符串

C++ - Tesseract 令人失望的性能

c++ - 从 PROP_ENTRY 转换为 PROP_ENTRY_TYPE