Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zawieszenie programu podczas próby wczytania łańcuchów znakowych przy pomocy funkcji realloc

Ostatnio zmodyfikowano 2014-06-25 17:42
Autor Wiadomość
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 :)
C/C++
#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]
P-112677
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.
P-112705
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 ?

C/C++
#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; // liczba zmian
   
    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;
}
P-112726
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..?
P-112727
lukasz0393
Temat założony przez niniejszego użytkownika
» 2014-06-25 17:33:18
wtedy postaram naprawić wszystkie wytknięte błędy :)
P-112729
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().
P-112730
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? 
P-112733
pekfos
» 2014-06-25 17:42:58
Kompletnie co innego.
P-112734
« 1 »
  Strona 1 z 1