2012-04-14 11 views
0

[OK]を、ので、私は、次のCコードPrintf何とか何か変わる?

#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のソリューションが機能しました。

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

strncpyコピーのみ正確に一つの文字:

+0

はcodeliteでそれを再現カント - デバッグ/リリースで/行は同じ結果 – Ulterior

+8

ポスト**最小限**完全なコード例を示しますなし!これを関連する部品に減らすのは大変面倒です。さらに、私はこのコードに問題があることには驚かない。これはC++の名前でしかありません。あなたはその言語の利点を利用せず、全体を通して低レベルの操作を使用します。 –

+1

これが関連しているかどうかは不明ですが、 'for(int i = 8; i <17; i ++)'のようなものは好きではありません。つまり残りは8の倍数ですが、「i <17」はあまりにも遠すぎるようです。 –

答えて

2

は、次の2行で概念的なエラーがあります。特にout[0]niza[0]に等しく、out[1]はこれまでにあったものである。 strcatは、0文字が見つかる次の位置にnizaと書き込みます。これは致命的な結果を招く可能性があります。 (strncpyのマニュアルページはよくそう言っています)

strcpyを後で実行するには、おそらく'\0'をそこに配置する必要があります。しかし、はるかに簡単に解決策があります:

out[0] = niza[0]; 
strcpy(out + 1, niza); 
+0

'strncpy'が答えであれば、おそらく間違った質問をしているでしょう。 http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy。html –

+0

@KeithThompson奇妙なことに、私はものを印刷するとうまくいきましたが、そうしなかったときには失敗しました。 – FREEZX

+0

@FREEZX、あなたのスタックへの範囲外の書き込みがあれば、何かが起こる可能性があります。そのような場合には、変数のスタックレイアウトにほとんど変更を加えなければ、一見大きな変化が生じる可能性があります。 –

関連する問題