错误的循环/阅读C ++

时间:2014-03-18 22:37:02

标签: c++

我只是在学习C ++。我写了一个程序,显示字符串中重复的字母(我还要计算字母重复的次数)。问题是当我运行我的代码来获取句子中的重复字母时。对某些人来说,它运行正常但不是一些。例如:“hi there”运行良好的返回h和e,但像“people are nice”之类的东西会返回peeeeee。重复的字母只能显示一次。请把问题指出来。我认为它与循环有关,但无法准确解决。

void repeatWord(string sentence)
{
    for(int i=0; i<sentence.length(); i++)
        for(int j=i+1; j<sentence.length(); j++)
            if((!isspace(sentence[i]))&&(sentence[i] == sentence[j])){
                cout<<sentence[i]<<endl;
            }
    return;
} 

2 个答案:

答案 0 :(得分:3)

问题是你的内循环。它每次遇到时都会显示一次这封信。此外,在看到重复之后,您不会突破循环,因此会出现指数混乱。

更好的方法是记录您看过一封信的次数。这只需要一个循环和一个数组:

int count[256] = {0};
for( int i = 0; i < sentence.length(); i++ ) {
    char c = sentence[i];
    if( isalpha(c) && count[c]++ == 1 ) cout << c;
}

您可以使用std::set代替数组。如果您正在处理Unicode,那将更合适。但是,我们只是在这里处理char,这几乎是您可能正在练习的每个架构上的8位。


这样做的一点好处是你计算字母频率。您可以按如下方式输出:

for( int c = 0; c < 256; c++ ) {
    if( count[c] ) cout << (char)c << " : " << count[c] << endl;
}

如果要输出不区分大小写的计数,一种方法就是这样:

for( int c = 'a'; c <= 'z'; c++ ) {
    int total = count[c] + count[toupper(c)];
    if( total ) cout << (char)c << " : " << total << endl;
}

答案 1 :(得分:1)

轻松删除重复的字母:只需插入<set>或在看到它们后删除字母即可。然而,插入集合更有效:

set<char> letters;
for(int i=0; i<sentence.length(); i++)
    for(int j=i+1; j<sentence.length(); j++)
        if((!isspace(sentence[i]))&&(sentence[i] == sentence[j])){
            letters.insert(sentence(i));
        }
for(auto &i : letters)
    cout << i << endl;