回 帖 发 新 帖 刷新版面

主题:程序在Vc6.0中运行出错

[code=c]
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<iterator>
#include<algorithm>
#include<cctype>
using namespace std;

char toLower(char ch) {return tolower(ch);}
string & ToLower(string & st);
void display(const string & s);

int main()
{
    vector<string> words;
    cout<<"Enter words(enter quit to quit): \n";
    string input;
    while(cin>>input && input!="quit")
        words.push_back(input);

    cout<<"You entered the following words: \n";
    for_each(words.begin(),words.end(),display);
    cout<<endl;

    set<string> wordset;
    transform(words.begin(),words.end(),insert_iterator<set<string> >(wordset,wordset.begin()),ToLower);
    cout<<"\nAlphabetic list of words: \n";
    for_each(wordset.begin(),wordset.end(),display);
    cout<<endl;

    map<string,int> wordmap;
    set<string>::iterator si;
    for(si=wordset.begin();si!=wordset.end();si++);\
        wordmap[*si]=count(words.begin(),words.end(),*si);

    cout<<"\nWord frequency: \n";
    for(si=wordset.begin();si!=wordset.end();si++)
        cout<<*si<<": "<<wordmap[*si]<<endl;

    return 0;
}

string & ToLower(string & st)
{
    transform(st.begin(),st.end(),st.begin(),toLower);
    return st;
}

void display(const string & s)
{
    cout<<s<<" ";
}
[/code]
请教各位大侠,程序编译无错,运行出错?

回复列表 (共1个回复)

沙发

不好的编码习惯必然是要出问题的,即便不是现在!

    set<string>::iterator si;
    for(si=wordset.begin();si!=wordset.end();si++);\
        wordmap[*si]=count(words.begin(),words.end(),*si);

正常而言,为了看起来舒服,更为了不使变量名污染到外面,会写成

    for(set<string>::iterator si=wordset.begin();si!=wordset.end();si++);\
        wordmap[*si]=count(words.begin(),words.end(),*si);

这时候编译的话,就会报si未定义,仔细看一下,果然没定义,因为 for() 后面多了个分号。

为什么一开始会出现这个错误?因为作者不知道出于什么目的,要把一个临时的变量扩大到整个main域,故意留下陷阱,然后再踩上去。

我来回复

您尚未登录,请登录后再回复。点此登录或注册