0

わかりましたので、次のCコードがあります

#include <cstdio>
#include <cstring>

// funkcija za mnozenje na dva 8-bitni broja (vo RC format) so Butov algoritam
// vlez:    a[] - mnozenik, b[] - mnozitel
// izlez:   proizvod[] - proizvodot (mnozenik * mnozitel)


void shiftRight(char niza[])
{
    char out[100];
    strncpy(out, niza, 1);
    strcat(out, niza);
    out[17]='\0';
    strcpy(niza, out);
}


void add(char opa[], char opb[])
{
    char rez[100];
    strcpy(rez, opa);
    char carry='0';
    int i=16;
    while(i>=0)
    {
        int car=carry-'0';
        int currbita=opa[i]-'0';
        int currbitb=opb[i]-'0';
        rez[i]=((car+currbita+currbitb)%2)+'0';
        if(car+currbita+currbitb>=2)
        {
            carry='1';
        }
        else
            carry='0';
        i--;
    }
    strcpy(opa, rez);
}

void vtorKomplement(char in[], char out[])
{
    strcpy(out, in);
    for(int i=0; i<8; i++)
    {
        if(out[i]=='0')
            out[i]='1';
        else
            out[i]='0';
    }
    int i=7;
    char carry='1';
    while(carry!='0')
    {
        int car=carry-'0';
        int currbit=out[i]-'0';
        if(car+currbit>=2)
        {
            carry='1';
        }
        else
            carry='0';
        out[i]=((car+currbit)%2)+'0';
        i--;
    }
}

void mnozenjeButov(char a[], char b[], char proizvod[]) {
    int i;
    char rez[100];
    char A[100];
    char S[100];
    char P[100];
    strcpy(A, a);
    strcat(A, "000000000");
    vtorKomplement(a, S);
    for(i=8; i<17; i++)
    {
        S[i]='0';
    }
    S[17]='\0';
    strcpy(P, "00000000");
    strcat(P, b);
    strcat(P, "0");
    for(int i=0; i<8; i++)
    {
        if(P[15]=='0'&& P[16]=='1')
        {
            add(P, A);
        }
        else if(P[15]=='1' && P[16]=='0')
        {
            printf("Before add P: %s\n", P);
            add(P, S);
        }
        shiftRight(P);
        printf("Shifted P: %s\n", P);
    }
    for(int i=8; i<17; i++)
    {
        proizvod[i-8]=P[i];
    }
    proizvod[8]='\0';
}

int main() {
    int success = 1;

    char a[100];
    char b[100];
    char proizvod[100];
    char w_proizvod[100];

    // TEST 1
    strcpy(a, "00010011");
    strcpy(b, "00000101");
    strcpy(w_proizvod, "01011111");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 1: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);

    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }

    if (success == 1) {
        printf("Vasata programa gi pomina testovite uspesno!\n");
    } else {
        printf("Nekoi od testovite bea neuspesni.\n");
    }

    return 0;
}

すべて順調ですが、その後削除printf("Before add P: %s\n", P);したり、printf を実行したりすると、何か変なことが起こります。その後、出力が何らかの形で変化し、存在しないはずの文字が表示されます...デバッグを試みましたが、通常の出力が得られます。また、別のマシンでテストしてみましたが、そこにも奇妙な文字が表示されます。私はこの 1 時間ずっと頭を悩ませていました。どこが間違っているのか誰か教えてもらえますか? mingw GCC コンパイラでコードブロックを使用しています。

更新: Jens Gustedt のソリューションが機能しました。

4

1 に答える 1

2

次の 2 行に概念的なエラーがあります。

strncpy(out, niza, 1);
strcat(out, niza);

strncpyここでは、正確に 1 文字のみをコピーします。具体的には、以前に存在したものout[0]と同等でniza[0]あり、それが何であれです。out[1]次に、ゼロ文字が見つかった次の位置にstrcat書き込みます。これにより、壊滅的な結果が生じる可能性があります。niza(のマニュアルページはstrncpyそう言っています。)

strcpy後でできるようにするには、おそらく'\0'そこに a を配置する必要があります。しかし、もっと簡単な解決策があります:

out[0] = niza[0];
strcpy(out + 1, niza);
于 2012-04-14T16:23:57.273 に答える