2016-12-25 16 views
-1

strcpy_sを使用している場合は、常に同じエラーDebug Assertion failed. L Buffer is too small &&0が表示されます。誰かが私にそれを解決するのを助けることができる?私はデバッグモードで2012
error message「デバッグアサーションに失敗しました。バッファが小さすぎます」をデバッグするには?

struct Nod{ 
    char *Number; 
    char *Name; 
    Nod *drt, *stg; 
}; 



void Insert(Nod *&p, char* n, char nr []) 
{ 
    if(p==0) 
     p=makeNod(n, nr); 
    else 
    { 
     ... 
    } 
} 

Nod * makeNod(char *name, char nr[]) 
{ 
    Nod *p=new Nod; 
    p->Name=new char [strlen(name)+1]; 
    strcpy_s(p->Name, strlen(name), name); //Assertion failed   
    strcpy_s(p->Number, strlen(nr), nr); 
    p->stg=p->drt=0; 
    return p; 
} 
int main() 
{ 

    Nod *p=0; 
    int c; 
    char nr[9]; 
    char*name=new char [20]; 
    cin >> c; 
    while(c!=0) 
    { 
     cout << "Name: "<< endl; 
     cin >> name; 
     cout << "Number: "<< endl; 
     cin >> nr; 
     Insert(p, name, nr); 
     cin >> c; 
    } 
    return 0; 
} 

答えて

0

strcpy_s()の2番目の引数は、バッファのサイズのようです。が最初の引数であると指摘されています。文字列コピーはstrlen(name)文字のの終端ヌル文字をコピーする必要があるため、より1文字大きい以上のバッファを用意する必要があります。実際には、に適切なサイズのバッファを割り当てました。あなたはちょうどその事実についてstrcpy_s()を知らせなかった。

また、このエラーを乗り越えると、Numberのメモリが割り当てられていないことがわかります。実際には、のように、文字列が本当に長い場合など、strlen(str)の結果を実際に安全にすることをお勧めします。

0

まず、マイクロソフトのVisual Studioの究極、strcpy_sを使用していますが、それが主張するように、指定された長さ(strlen(name)は、name +終了\0に合うように十分ではないことを確認しました。

第2に、p->Numberのバッファを予約していませんでした。

Nod *p=new Nod; 
    p->Name=new char [strlen(name)+1]; 
    strcpy_s(p->Name, strlen(name)+1, name); // <-- +1, to not miss the null character at the end 
    p->Number=new char [strlen(nr)+1];  // <-- You missed this 
    strcpy_s(p->Number, strlen(nr)+1, nr); 

最後に、std::stringを使用して、これらの頭痛を保存してください。

関連する問題