Szyfrowanie macierzowe - dynamiczna alokacja tablic dwuwymiarowych
Ostatnio zmodyfikowano 2014-01-26 15:34
szwarcus Temat założony przez niniejszego użytkownika |
Szyfrowanie macierzowe - dynamiczna alokacja tablic dwuwymiarowych » 2014-01-25 21:38:06 Witam mój problem polega na tym, że program działał, chciałem przejść ze tablic statycznych na dynamiczne i zaczęły się schody i program przestał działać jak należy, cały algorytm szyfrowania jest w porządku. Dynamiczna alokacja jest zrobiona na podstawie ilości znaków w pliku wejściowym ( to też jeszcze działało). Chodzi w tym programie o to by wczytywał on z terminala ciąg znaków, zapisywał go do pliku wejściowego który wchodzi do pętli szyfracyjnej i po wykonaniu usuwa ten plik tworząc plik zaszyfrowany. I jeszcze jeżeli byście mogli to pomóżcie tak by przy wczytywaniu znaków z terminala, działał backspace i nie powodował zamieszania. Definicja _CRT_SECURE_NO_WARNINGS 1 jest wymagana w każdym moim programie jeżeli możecie to pomóżcie mi się tego pozbyć ( środowisko Visual Studio 2013 ) #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <math.h> #include <stdlib.h> #define MAX 100
char ** alokujTablice2D( int x, int y, char ** tab ) { tab =( char ** ) malloc( x * sizeof( char * ) ); int i; for( i = 0; i < x; i++ ) { tab[ i ] =( char * ) malloc( y * sizeof( char ) ); } return tab; } void main() { FILE * we, * wy, * wede; char wyjpath[ MAX ]; char wejscie[] = "plikwejsciowy.txt"; char wyjscie[ MAX ]; printf( "PODAJ SCIEZKE PLIKU WYJSCIOWEGO TWOJEGO SZYFRU\nSCIEZKA MUSI MIEC POSTAC np\n\t\t C:\\plikzaszyfowany.txt\nPAMIETAJ O DODANIU NAZWY PLIKU Z ROZSZERZENIEM TEKSTOWYM\n---------------------------------------------------------------------------\n\n" ); scanf( "%s", & wyjpath ); int getch(); for( int i = 0; i < MAX; i++ ) { wyjscie[ i ] = wyjpath[ i ]; } char ** macierz; char * pomoc; int i, j, k, l, m, n; char znak; i = 0; char zp[ 30 ]; size_t sz; { printf( "PLIK WEJSCIOWY JEST USUWANY PO ZASZYFROWANIU\n\n" ); printf( "1)PODAJ DOWOLNY CIAG ZNAKOW DO SZYFRU\n" ); printf( "2)NIE UZYWAJ BACKSPACE !!!!!!!\n" ); printf( "3)NIE UZYWAJ ZNAKOW SPECJALNYCH\n" ); printf( "4)JESLI CHCESZ ZAKONCZYC WCISNIJ ENTER\n\n" ); we = fopen( wejscie, "ab" ); scanf( "%s", & zp ); do { fputc( zp[ 30 ], we ); printf( "%c", zp ); } while(( char ) zp != 13 ); fclose( we ); } fseek( we, 0, 2 ); sz = ftell( we ); pomoc =( char * ) malloc( sz * sizeof( char ) ); alokujTablice2D( sz, sz, macierz ); we = fopen( wejscie, "rb" ); wy = fopen( wyjscie, "wb" ); if( we != NULL ) { if( wy != NULL ) { while(( znak = getc( we ) ) != EOF ) { pomoc[ i ] = znak; i++; } j = 1; do { j++; k = j * j; } while( k < i ); for( l = 0; l < j; l++ ) for( m = 0; m < j; m++ ) { macierz[ l ][ m ] = 32; } m = 0; n = 0; for( l = 0; l < i; l++ ) { macierz[ n ][ m ] = pomoc[ l ]; m++; if( m == j ) { n++; m = 0; } } for( l = 0; l < j; l++ ) for( m = 0; m < j; m++ ) { znak = macierz[ m ][ l ]; putc( znak, wy ); } fclose( wy ); } fclose( we ); } printf( "\n\n\n\n\nOperacja zostala zakonczona\n" ); wede = wy; remove( wejscie ); system( "pause" ); }
|
|
szwarcus Temat założony przez niniejszego użytkownika |
» 2014-01-26 15:34:53 Z dynamiczną alokacją trochę ciężko ale udało mi się napisać tak by backspace działał :) #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #define MAX 100
void komunikat() { printf( "PLIK WEJSCIOWY JEST USUWANY PO ZASZYFROWANIU\n\n" ); printf( "1)PODAJ DOWOLNY CIAG ZNAKOW DO SZYFRU\n" ); printf( "2)NIE UZYWAJ ZNAKOW SPECJALNYCH\n" ); printf( "3)JESLI CHCESZ ZAKONCZYC WCISNIJ ENTER\n\n" ); }
int main() { FILE * we = fopen( "plikwejsciowy.txt", "ab" ), * wy, * wede; char macierz[ MAX ][ MAX ], pomoc[ MAX ], wyjscie[ MAX ], wyjpath[ MAX ], znak, tab[ 100 ]; printf( "PODAJ SCIEZKE PLIKU WYJSCIOWEGO TWOJEGO SZYFRU\nSCIEZKA MUSI MIEC POSTAC np\n\t\t C:\\plikzaszyfowany.txt\nPAMIETAJ O DODANIU NAZWY PLIKU Z ROZSZERZENIEM TEKSTOWYM\n---------------------------------------------------------------------------\n\n" ); scanf( "%s", & wyjpath ); for( int i = 0; i < MAX; i++ ) { wyjscie[ i ] = wyjpath[ i ]; } int i = 0, j, k, l, m, n; fflush( stdin ); komunikat(); fgets( tab, sizeof( tab ), stdin ); fputs( tab, we ); fclose( we ); we = fopen( "plikwejsciowy.txt", "rb" ); wy = fopen( wyjscie, "wb" ); if( we != NULL ) { if( wy != NULL ) { while(( znak = getc( we ) ) != EOF ) { pomoc[ i ] = znak; i++; } j = 1; do { j++; k = j * j; } while( k < i ); for( l = 0; l < j; l++ ) for( m = 0; m < j; m++ ) { macierz[ l ][ m ] = 32; } m = 0; n = 0; for( l = 0; l < i; l++ ) { macierz[ n ][ m ] = pomoc[ l ]; m++; if( m == j ) { n++; m = 0; } } for( l = 0; l < j; l++ ) for( m = 0; m < j; m++ ) { znak = macierz[ m ][ l ]; putc( znak, wy ); } fclose( wy ); } fclose( we ); } printf( "\n\n\n\n\nOperacja zostala zakonczona\n" ); wede = wy; remove( "plikwejsciowy.txt" ); system( "pause" ); return 0; }
|
|
« 1 » |