0

この特定のエラーを検索したところ、ループ カウントが間違っていて、プログラムが配列の境界を超えていることが根本的な問題であることがわかりました。

ただし、配列が出力時にデータを失い始めるポイントまで各配列を下げた後も、同じエラーがスローされ続けました。私はまだ C/C++ に慣れていませんが、これについての洞察をいただければ幸いです。

プログラムは最後まで実行されたようで、メイン メソッドに戻ります。

#include <stdio.h>



void sortAr(char[]);

    int main ()
{
    char a='y';
    char b,i;
    char c[20];
    int x=0,n=0,z=0;
    while (x<=19)
    {
        c[x]='@'; 
        x++;
    }

    printf("Enter 20 letters: \n"); 

    while (z<=20) //(The '=' caused my problem, removed and it runs fine.)
    {
        z++;
        x=0;
        b='y';
        scanf("%c",&i);
        while (x<=19)
        {
            if (c[x]==i)
                b='n';
            x++;
        }

        if (b=='y')
        {
            c[n]=i;
            n++;
        }
    }
    printf("\n");
    printf("The nonduplicate values are: \n");      

    sortAr(c);

}





    void sortAr(char ar[])
    {
        char z;
    for (int i = 0; i <= 19; i++) 
    {
        for (int j=i+1; j <= 19; ++j)
        {
            if (ar[i]>ar[j])
            {
                z =  ar[i];
                ar[i] = ar[j];
                ar[j] = z;
            }
        }
    }
    for (int i = 0; i < 20; i++) 
    {
        if(ar[i]=='@')
            continue;
        printf("%c ", ar[i]);
    }
    printf("\n");
    }
4

1 に答える 1

3

エラーは次の場所で見つかりました。

while (z<=20)

その理由は、配列がメモリ内でインデックスを作成した回数よりも多く実行することで、配列が意図したよりも多くの文字を上書きするためです。その結果、割り当てられていないメモリに書き込み、Stack_Buffer_Overrun を引き起こしました。

Trace Z:

Z was initialized to 0.
Array was initialized to 20.

While loop starts with Z as the counter for read-ins.
z=0 array=1 1st run,
z=1 array=2 2nd run,
z=2 array=3 3rd run,
z=3 array=4 4th run,
...
z=20 array=21 21st run. (Array cannot hold 21st character and results in Stack_Buffer_Overrun.)

解決:

change while(z<=20) -> while(z<20)
于 2015-04-04T10:16:54.957 に答える