2012-04-14 5 views
0

좋아, 그래서 나는 모든 것이 잘하고 좋은 다음 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의 배수이지만, '나는 <17'이다. –

답변

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, 스택에 쓰기가 부족한 경우 아무 일도 발생할 수 있습니다. 그리고 그러한 경우에, 변수의 스택 레이아웃을 조금만 변경하면, 동작이 크게 변경 될 수 있습니다. –

관련 문제