좋아, 그래서 나는 모든 것이 잘하고 좋은 다음 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
만 복사 정확히 하나 개의 문자 :
이 codelite 그것을 재현하지 못할 - 디버그/릴리스/라인이 같은 결과 – Ulterior
올리기 ** 최소 ** 전체 예제 코드를 제공하지 않고! 이 부분을 관련 부분으로 축소하는 것은 대단한 번거 로움입니다. 게다가이 코드에 문제가 있다는 것은 놀랄 일이 아닙니다. 이름만으로 C++입니다. 당신은 언어의 이점을 이용하지 않으며, 전체적으로 저수준 오퍼레이션을 사용합니다. –
이것이 관련되어 있는지는 모르지만 'for (int i = 8; i <17; i ++)'비트가 마음에 들지 않습니다. 내 말은, 나머지는 8의 배수이지만, '나는 <17'이다. –