lukasz0393 Temat założony przez niniejszego użytkownika |
zawieszenie programu podczas próby wczytania łańcuchów znakowych przy pomocy funkcji realloc » 2014-06-24 23:14:21 W funkcji main chciałbym wczytać za pomocą funkcji czytaj, 2 łańcuchy, wywołać funkcje usun, wyswietlić nowy lancuch i liczbe dokonanych zmian. Myślę że coś jest źle podczas wczytywania lancuchów, ale nie mogę odszukać przyczyny, proszę o pomoc :) #include<stdio.h> #include<string.h> #include<stdlib.h> char * czytaj() { char znak; char * tab; int i = 0; while( scanf( "%c", & znak ) ) { if( tab[ i ] != ' ' && tab[ i ] >= 'A' && tab[ i ] <= 'z' ) { break; } tab =( char * ) realloc( tab,( i + 1 ) * sizeof( char ) ); tab[ i ] = znak; i++; } return tab; }
int sprawdz( char * lan, char zn ) { int i = 0; for( i = 0; lan[ i ] != '\0'; i++ ) { if( lan[ i ] == zn ) { return 1; } else { return 0; } } }
char * usun( char * lan1, char * lan2, int * n ) { int i = 0; int licznik = 0; int usuniete_litery = 0; char * nowy; for( i = 0; lan1[ i ] != '\0'; i++ ) { if( sprawdz( lan1, lan2[ i ] ) == 0 ) { nowy[ i ] = lan1[ i ]; licznik++; } else { usuniete_litery++; } } n = & usuniete_litery; nowy =( char * ) calloc( 10, sizeof( char ) ); }
int main() { char * lancuch1; char * lancuch2; lancuch1 = czytaj(); lancuch2 = czytaj(); return 0; }
warning: passing argument 3 of 'usun' from incompatible pointer type [enabled by default] warning: format '%d' expects argument of type 'int', but argument 3 has type 'int *' [-Wformat] warning: control reaches end of non-void function [-Wreturn-type] warning: control reaches end of non-void function [-Wreturn-type] warning: 'nowy' may be used uninitialized in this function [-Wuninitialized]
|
|
pekfos |
» 2014-06-25 11:02:45 W czytaj() używasz nieistniejącej tablicy. Podobnie w usun(). Z ostrzeżeniami raczej sobie poradzisz, są jasno napisane. |
|
lukasz0393 Temat założony przez niniejszego użytkownika |
» 2014-06-25 17:20:47 Poprawiłem funkcję czytaj i teraz wczytuje łańcuchy prawidłowo, log również jest już czysty. Ale jest coś nie tak z funkcją usuń, ponieważ nie zwraca mi nowego łańcucha tylko jakieś krzaki. W czym może tkwić problem ? #include<stdio.h> #include<string.h> #include<stdlib.h> char * czytaj() { char * tab = NULL; int i = 0; tab =( char * ) malloc(( i + 1 ) * sizeof( int ) ); scanf( "%c", tab ); while( *( tab + i ) != '\n' ) { i++; tab =( char * ) realloc( tab,( i + 1 ) * sizeof( char ) ); scanf( "%c", tab + i ); } *( tab + i ) = '\0'; return tab; }
int sprawdz( char * lan, char zn ) { int i = 0; for( i = 0; lan[ i ] != '\0'; i++ ) { if( lan[ i ] == zn ) { return 1; } else { return 0; } } }
char * usun( char * lan1, char * lan2, int * n ) { int i = 0; int licznik = 0; int usuniete_litery = 0; char * nowy; for( i = 0; lan1[ i ] != '\0'; i++ ) { if( sprawdz( lan1, lan2[ i ] ) == 0 ) { nowy[ i ] = lan1[ i ]; licznik++; } else { usuniete_litery++; } } * n = usuniete_litery; nowy =( char * ) malloc(( licznik + 1 ) * sizeof( char ) ); return nowy; }
int main() { char * lancuch1; char * lancuch2; char * nowy; int x; printf( "Podaj pierwszy lan: " ); lancuch1 = czytaj(); printf( "\nPodaj drugi lan: " ); lancuch2 = czytaj(); nowy = usun( lancuch1, lancuch2, & x ); printf( "Liczba zmian wynosi: %d\n", x ); printf( "Nowy lancuch wynosi: %s\n", nowy ); return 0; }
|
|
pekfos |
» 2014-06-25 17:28:40 Rozumiem, że nie ma sensu wytykać wielu błędów, bo naprawiony zostanie pierwszy z listy i pytanie padnie ponownie..? |
|
lukasz0393 Temat założony przez niniejszego użytkownika |
» 2014-06-25 17:33:18 wtedy postaram naprawić wszystkie wytknięte błędy :) |
|
pekfos |
» 2014-06-25 17:34:54 Ty już pytasz o błąd, który opisałem. W czytaj() używasz nieistniejącej tablicy. Podobnie w usun(). |
|
|
lukasz0393 Temat założony przez niniejszego użytkownika |
» 2014-06-25 17:42:21 myślałem że jest dobrze, bo próbowałem wyświetlić wczytane łańcuchy w funkcji czytaj() i było ok. czyli utworzenie wskaźnika do tablicy a utworzenie tablicy to co innego? |
|
pekfos |
» 2014-06-25 17:42:58 Kompletnie co innego. |
|
« 1 » |