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

Alokacja, struktury i wskazniki.

Ostatnio zmodyfikowano 2012-10-13 23:04
Autor Wiadomość
nimlot20
Temat założony przez niniejszego użytkownika
Alokacja, struktury i wskazniki.
» 2012-10-13 17:30:37
Czesc, napisalem program, w ktorym mam strukture raz. I chcialbym, przydzielic pamiec dla chara. Chyba wszystko dobrze zrobilem, ale printf wypisuje mi dziwne rzeczy zamiast slowa 'miki'. Prosze o pomoc w poprawieniu kodu, bo glowkuje juz dosc dlugo. :(

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct str
{
    int a;
    char * wyraz;
};

int main()
{
    struct str * raz;
    char text[] = "miki";
    raz =( str * ) malloc( sizeof( str ) );
    raz->wyraz =( char * ) malloc( sizeof( char ) * strlen( text ) );
    strncpy( raz->wyraz, text, sizeof( char ) * strlen( text ) );
    printf( "%s", raz->wyraz );
}
P-66756
cyklopek11
» 2012-10-13 18:20:39
strlen() zwraca długość C-stringu bez końcowego nulla
C/C++
...
raz->wyraz =( char * ) malloc( sizeof( char ) *( strlen( text ) + 1 ) );
strncpy( raz->wyraz, text, sizeof( char ) *( strlen( text ) + 1 ) );
...
P-66767
nimlot20
Temat założony przez niniejszego użytkownika
» 2012-10-13 21:26:20
Dzieki, za zainteresowanie i pomoc. Moglbys/moglibyscie jeszcze mi pomoc z jedna rzecza. Co zrobic, jesli slowo 'miki'(albo inne) chce, zeby definiowal uzytkownik. Tutaj moj kod.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct str
{
    int a;
    char * wyraz;
};

int main()
{
    struct str * raz;
    char *text;
    scanf("%s", &text);
    raz =( str * ) malloc( sizeof( str ) );
    raz[0].wyraz =( char * ) malloc( sizeof( char ) * strlen( text ) + 1 );
    strncpy( raz[0].wyraz, text, sizeof( char ) * strlen( text ) + 1 );
    printf( "%s", raz->wyraz );
}
P-66782
cyklopek11
» 2012-10-13 21:59:12
funkcja scanf()z stdio.h. Ja bym jednak sugerował przepisanie kodu na C++ i wczytywanie do std::stringu. Po prostu operacje na std::stringu to czysta przyjemność.
P-66786
nimlot20
Temat założony przez niniejszego użytkownika
» 2012-10-13 22:08:23
Tak, ale ten program ma byc w C. Wiec masz moze jakis pomysl? :)

EDIT:  wystarczy tylko zamieni jedna linie i wszystko gra.
To:
char *text;
na to:
char text[20];

EDIT2:
Ale mam wrazenie, ze zle zaalokowana jest pamiec. Bo po wpisaniu
printf( "%d", sizeof(raz[0].wyraz) );
zawsze pokazuje 4. Hmm?
P-66788
cyklopek11
» 2012-10-13 22:44:40
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct str
{
    int a;
    char * wyraz;
};
int size;

int main()
{
    puts( "Jaka ma byc dlugosc C-stringa?" );
    scanf( "%d", & size );
    char * tempString =( char * ) malloc( sizeof( char ) *( size + 1 ) );
    puts( "Wprowadz C-string" );
    scanf( "%s", tempString );
    if( strlen( tempString ) > size )
    {
        puts( "Wprowadziles dluzszy wyraz niz obiecywales, popraw sie" );
        return 1; // buffer overflow, nie ma sensu kontynuować dalej programu
    }
    struct str * raz;
   
   
    raz->wyraz = tempString;
    tempString = NULL;
    printf( "%s", raz->wyraz );
    return 0; // prawidlowe zakonczenie programu
}
P-66789
nimlot20
Temat założony przez niniejszego użytkownika
» 2012-10-13 22:55:35
Dzieki jeszcze raz za zaangazowanie, ale ten kod sie nie kompiluje.

I moze doprecyzuje co ma robic program. Uzytkownik podaje wyraz. A program umieszcza go w miejscu raz[0].wyraz. Wczesniej wyznacza mu pamiec, tak, zeby slowo zabieralo minimum potrzebnej pamieci. Aczkolwiek ten algorytm, ktory ty chcesz zrobic jest spoko. Ja chce zrozumiec C a nie to jak zaimplementowac dany algorytm. :)
P-66790
cyklopek11
» 2012-10-13 23:04:50
Musisz dodać do projektu wyrażenie: -std=c99 aby "łykał" kod zgodnie ze standardem c99
P-66791
« 1 »
  Strona 1 z 1