[ galitden @ 13.03.2007. 19:34 ] @
Evo ljudi pisem program (za maturalni rad) koji služi za kriptiranje podataka i pri tome koristi des algoritam. Te jedan dio programa treba rotirati zadane bitove... U ovom codu sto sam postavio ovdje, imaju dvije greške, prvo program mi neće da izađe iz prve FOR petlje (ako mi je uvjet nije k<x, ako je x od 1 do 14 izlazi iz petje a ako je x od 15 pa nadalje ne izlazi iz petlje).
A drugi problem je pri ispisu C nizova pomoću druge FOR petlje, ispisani nizovi imaju duljine veće od 28 znakova (tj. imaju više od 28 znakova)??? Te evo molim vas da mi pokažete i objasnite u čemu je problem???
Zadatak ovoga djela programa je da sa zadanim stringom u ovome slučaju C[0] i D[0] vrši rotiranje znakova u ljevo... I to tako da stvori 16 novih stringova ( C[1] , C[2], ... , C[16] i D[1] , D[2], ... , D[16] ) pri čemu je svaki pomaknut u odnosu na predhodni za 1 ili 2 znaka što ovisi o trenutnoj vrjednosti K.
Code:

#include <iostream>
#include <string>
using namespace std;

void pomicanje_ljevo(char a[], int x, char b[])
{
if(x==1){
 char temp=a[0];
 for(int s=0;s<27;s++)
 b[s]=a[s+1];
 b[27]=temp;
 b[28]='\0';
}
else{
 char temp1 =a[0],temp2=a[1];
 for(int s=0;s<26;s++)
 b[s]=a[s+2];
 b[26]=temp1;
 b[27]=temp2;
 b[28]='\0';
}
}

int main()
{
char C[17][28],D[17][28];

strcpy(C[0],"0000000011111111111111111001");
strcpy(D[0],"1001001010100111001011100001");

C[0][28]='\0';
D[0][28]='\0';
cout<<C[0]<<endl;
cout<<D[0]<<endl<<endl;

for(int k=0;k<16;k++){

 if(k==0 || k==1 || k==8 || k==15){
    pomicanje_ljevo(C[k],1, C[k+1]);
    pomicanje_ljevo(D[k],1, D[k+1]);
 }
 else{
    pomicanje_ljevo(C[k],2, C[k+1]);
    pomicanje_ljevo(D[k],2, D[k+1]);
 }

}
for(int z=1;z<17;z++)
{
cout<<"C: "<<C[z]<<endl;
}
return 0;

[ Mali Misha @ 13.03.2007. 20:16 ] @
Svaki od for-ova ti se sigurno završava.

Da bi radio C[0][28] = 0, trebaš C da definišeš kao C[ nekakonstanta ][29]. Kada ovo ispraviš, trebalo bi da stringovi prilikom ispisa ne cure (tj. da dužine izlaznih stringova ne budu veće od očekivanih).
[ galitden @ 14.03.2007. 21:44 ] @
Probao sam to sa "nekakonstanta" no opet isti problem, ispisjue mi više od 28 znakova... Mozda nisam dobro napisao, mozete li mi vi dati primjer kako da to napravim sa ovim djelom programa???
[ Mali Misha @ 15.03.2007. 05:45 ] @
Nije ovde poenta u nekojkonstanti, koja je trebala da ti ostane isti broj kao što je i bila, nego u broju iza nje.

Indeksiranje polja u jeziku C počinje od 0, i ako odrediš da imaš 28 mesta, možeš da pišeš na indeksima 0-27. Ne i na 28-om (zapravo 29-om po redu). Zbog toga je ovo:
Code:
char C[17][28];
// ...
C[0][28]='\0';
Uzrok tvog problema. Treba da povećaš dužine nizova po kojima pišeš sa 28 na 29 pri deklaraciji.
[ galitden @ 15.03.2007. 17:01 ] @
Sada radi! Puno hvala na pomoći...