1

我在使用这个程序时遇到了问题。编译器在成功编译程序后给我这个:“0x0f6bd540(msvcr100d.dll)”中的未处理异常“progBUS.exe”
程序有什么问题,因为一切似乎都运行良好,但最后,在按下“ Enter" 退出控制台,错误 - 给出未处理的异常。如何解决?非常感谢!

# include <iostream>
# include <cstring>

using namespace std;

template < class T>
void switcher(T &a, T &b){
    T c=a;
    a=b;
    b=c;
}

char* f(char* word){
    static char* ss("u");
    static int iter(0);

    cout<<"word \""<<word<<"\" has been thrown\n";
    if ( strcmp(word,ss)!=0 && strcmp(word,"")!=0) {ss=word; iter=0;} //if another word has been thrown
    cout<<"ss="<<ss<<"  iter="<<iter<<endl;
    static char ret[15];//return word value
    memset(ret, '\0', 14);//clean up ret value

    int len = strlen(ss);
    int j=0;
    if (iter == len-1) return nullptr;//we have reached the end of word

    for (int i=iter;i<len;i++){
        //cout<<"*(ss+i)="<<*(ss+i)<<endl;
        if (*(ss+i)!=' ') ret[j]=*(ss+i);
        else { iter=i+1; return ret;}
        //cout<<*(ss+i);
        j++;
        if(i==len-1) {iter=i+1; return ret;}
    }
    return nullptr;
}

int main(){
    int a=1,b=2;

    cout<<f("fr rewfer ewr")<<endl;
    cout<<f("fr rewfer ewr")<<endl;
    cout<<f("43 34")<<endl;
    cout<<f("")<<endl;
    cout<<f("")<<endl;
    cout<<f("fr rewfer ewr")<<endl;
    //char ss[]("fr rewfer ewr");
    //size_t len = (sizeof ss)/(sizeof ss[0]);
//  cout<<"len="<<len<<endl;

    system("PAUSE");
    return 0;
}
4

2 回答 2

3

你需要一些纪律。你想使用:

f("fr rewfer ewr");

文字字符串可能位于只读内存中。你需要承诺你不会改变它:

char*f(const char* word) ;

你有s("U");ss=word;所以你也需要:static const char* ss; 但是ss static你需要确保ss在通话之间保持有效的内容。复制单词?现在,你ret[15]只有 0 和 14。为什么不是 15?而且您无法控制您可能可以在其中写入超过 14 个字符。F 可以返回nullptr,但在你的 main 中你不测试nullptr. std::string如果您使用其他 C++ 标准库工具,您的一些问题可能会消失。

于 2013-02-08T08:52:59.553 回答
0

所有的问题都在

cout<<f("")<<endl;

当 f 退休时 nullptr

于 2013-02-08T09:08:28.180 回答