1

このプログラムに問題があります。プログラムのコンパイルが成功した後、コンパイラは次
のように表示します。 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ますが、メインでは をテストしませんnullptrstd::stringおよびその他の C++ 標準ライブラリ機能を使用すると、問題の一部が解消される可能性があります。

于 2013-02-08T08:52:59.553 に答える
0

すべての問題がありました

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

f が nullptr を退職したとき

于 2013-02-08T09:08:28.180 に答える