[C] Stringi w tablicach char

0

Zalozmy ze mamy tablice okreslona jako:

char imie[1];

i nastepnie wprowadzamy do niej

stcpy(imie,"Ten komputer ma na imie XYZ");

Jako dziecie wychowane na pascalu uznalam ze powinno sie walnac, kaze mu wyswietlic napis

printf("\nImie: %s",imie);

Uruchamiam. Wyswietla grzecznie caly dlugi lancuch... No dobra, powiekszyl sobie tablice, zdolna bestia. Jedzmy dalej.

int wielkosc;
wielkosc=strlen(imie);

I teraz zaczyna sie cos czego nie rozumiem. Jesli strlen jest wrzucone po wypisaniu na ekran stringa, to jest ok. wyswietla sie string po czym jego wielkosc (tez dziwnie zliczana, bo brakuje informacji o obecnosci znaku konca stringa). Jesli zas strlen wrzucic miedzy przypisanie stringa a wyswietlenie go, to string zostaje obciety do bodajze 7 znakow, po ktorych nastepuje chyba losowy znak ascii, ale dlugosc stringa jest nadal wyswietlana taka, jak wprowadzonego, nie jak wypisanego....

Czy ktos moze mi, niewiescie biednej i nieoswieconej, wyjasnic, co robi moj niszczesny Turbo C z tym kodem? Bo ja nie panimaju czy jak to tam towarisze ze wschodu by rzekli ;-)
</ort>

0

pokaz kod bo nie czaje opisu :)

0

... No dobra, powiekszyl sobie tablice, zdolna bestia...
na pewno sobie nie powiekszyl, tylko zapisal te dane w pamieci nie przeznaczonej do tego.
Dobra rada: Lepiej dbac o to by w tablicy bylo wystarczajaco miejsca na napis. Jesli sie o tym zapomni to moze byc to powodem wielu dziwnych i trudnych do "wytropienia" bledow.

//DOPISANE:
To jest tak jak bys gotowala zupe z granatow (tych co sa uzywane na wojnie) i dziwila sie ze to wybucha.
Co do funkcji to polecam http://galaxy.uci.agh.edu.pl/~chwastek/lectures/C/spis.html

//DOPISANE2:
Co do pytania to dzieje sie tak poniewaz kopiowanie nie zwaza na nic tylko kopiuje od podanego adresu, az do skonczenia napisu a jesli nie miesci sie w danej tablicy to znaki kopiowane sa do nastepnych zmiennych (jesli takie sa, a tutaj jest). Przy wypisywaniu jest podobnie tylko znaki sa pobierane az do napotkania 0, poniewaz modyfikujesz ta zmienna co jest po tablicy to rowniez zmienia sie napis, ktory "wkroczyl" na ta zmienna i pewnie, ktorys bajt tej zmiennej reprezentuje 0 i dlatego napis sie konczy. Wydaje mi sie nawet, ze ten znak, ktory sie pojawia to powinien byc znak o kodzie ASCII rownym dlugosci napisu.

0
#include <stdio.h>
char imie[1];
int dlugosc;
main()
{
	strcpy(imie,"Ten komp ma na imie Tak A Nie Inaczej");
/* pierwsze wystąpienie	dlugosc=strlen(imie); */
	printf("\nImie to %s",imie);
/* drugie wystąpienie	                dlugosc=strlen(imie); */
	printf("\nDlugosc lancucha to %d",dlugosc);
	return(0);
}

I teraz tak:
przy braku pobierania dl. lanc. wyswietla sie caly napis, podobnie przy drugim miejscu wystapieniu polecenia strlen - w koncu wykonywane jest ono juz po wypisaniu na ekran zawartosci lancucha. Przy polozeniu pierwszym wyswietli sie 'Imie to Ten kom)' i nic wiecej...
W obu wypadkach dlugosc lancucha jest podawana jako ilosc znakow w lancuchu i jest taka sama (tzn poprawna bez wzgledu na miejsce wystapienia, ale pomijajaca znak konca stringa)

Nie rozumiem czemu strlen nie wlicza znaku konca stringa do jego dlugosc ani przede wszystkim, dlaczego w zal, od polozenia strlen w programie - wyswietla sie raz caly napis, a raz fragment (bo z tego ze wyswietla sie wiecej niz 'T' wnosze ze C sobie sam, spryciarz, przydzielil wieksza tablice...)

Hmm no to przydzielil sobie nieswoja, jeszcze lepiej.... thank God ze TC jest na laptopie z czystym dosem...
Hmm tyle to ja wiem, po prostu w mojej madrej ksiazce omylkowo jak mniemam wystapilo zadeklarowanie tablicy 4 elementowej dla imienia 5literowego i jak sprawdzilam okazalo sie ze dziala, stad zdziwienie... i pytania :)

0

On sobie nie powieksza tablicy on po prostu wchodzi na kolejne komorki pamieci :) . A strlen dziala mniej wiecej tak while(tab[i]){i++};return i;

Przeszukuje stringa az napotka NULL :)

0
char* imie=strdup("ala ma :")
if(imie){
  printf("%s rudego kota\n",imie);
  free(imie);
}

i miedzy innymi tak mozna to prawidlowo rozwiazac

0

lol masz po prostu wyciek pamieci, bo zapisujesz poza znakiem konca tablicy :P

0

char imie[1];

nie rozumiem dlaczego zdeklarowalas tablice z jednym elementem i przypisujesz do niej lancuch?? nawet jesli to nie jest jedynka tylko zmienna L (bo nie bardzo widze) to kompilator powinnien znać jej wartosc juz w trakcje kompilacji a nie podczas trwania programu!!!

A tak zupelnie na marginesie to jak masz na imie?

0

bo chciała pokazać że po przypisaniu dłuższego stringa do takiej tablicy jednoelementowej jest on zapisywany do dalszych komórek pamięci (przy okazji też niszcząc inne ewentualne zmienne które akurat mają te dalsze adresy)

0

1, nie zadne 'l' :)
dokladnie - wiem ze 'tak sie nie robi' ,ze 'bebe' itd ;-) przerabialam
programowanie dynamiczne i wiem ile mozna zlym przyporzadkowaniem namieszac, sam przyklad wzial sie z ciekawosci, chcialam sprawdzic czy zostanie zgloszony blad ;-) nie zostal 8-0 wiec sprawdzalam jak daleko mozna to nagiąć :)

a na marginesie to (chyba jest w profilu) - Agata, a cio? :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1