-2

乗り"Run-Time Check Failure #2 - Stack around the variable 'id' was corrupted."ますwhile condition。わからない!このエラーの原因は何ですか?

void Term::set_id()
{
    char id[Term::ID_LENGTH];
    do
    {
        cout << "\n\nEnter the term id(like 90911): ";
        cin >> id;
    }while(valid_id(id) != true);
}

bool Term::valid_id(char *id)
{
    //counting how many chars id has got:
    int n=0;
    for(char* str=id; *(str+n)!=0; n++);

    if(n!=Term::ID_LENGTH)
        return false;

    //checking that id consist of digits only
    int i=0;
    for( char* str=id; (*(str+i)>=48 && *(str+i)<=57) && i<Term::ID_LENGTH; i++);
    if(i<Term::ID_LENGTH)
        return false;

    int fy= (*(id) - 48) * 10 + (*(id+1) - 48);//former year
    int ly= (*(id+2) - 48) * 10 + (*(id+3) - 48);//latter year
    int t= *(id+4) - 48;//term number
    if(ly - fy != 1)//any difference other than 1
        return false;
    if(!(t==1 || t==2 || t==0))//t==0 is for summer term
        return false;

    return true;
}
4

2 に答える 2

2

このコードは単純な配列オーバーランのように見えます。読み取る文字数を制限するようにストリームを設定しない場合、配列またはポインタであるstd::cin >> strため、C の C++ バージョンになります。strcharchargets()width()

char id[Term::ID_LENGTH];
std::cin.width(Term::ID_LENGTH); // <-- without this you are prone to array overrun!
if (std::cin >> id) {
    // deal with a successful read
}

std::string文字列の入力に使用することを検討する必要があります。

std::string id;
if (std::cin >> id) {
    // deal with a successful read
}
于 2012-12-31T02:26:08.487 に答える
0

問題の原因はTerm::ID_LENGTH、'\0' のカウントを忘れていたことです。

于 2012-12-31T03:54:19.857 に答える