Problem z Tablicami w C

Witam. Jestem początkującym “programistom” i mam niestety mały problem mianowicie nie mam pojęcia jak wypisać całą tablicę typu char. To jest mój prosty kod i prosił bym o wskazówkę.

#include 


void sprawdzanie(void);


int main(void)

{

     sprawdzanie();


  system("PAUSE");	

  return 0;

}


void sprawdzanie(void)

{

 char slowo[]={"Ala ma kota"};


 printf("Twoje slowo to: %c\n", slowo);

}

Nie %c(znak) tylko %s(c-string).

char slowo[]="Ala ma kota"; // klamry nie potrzebne [/code]

[code=php]printf("Twoje slowo to: "); puts(slowo); // razem z enterem 

printf("Twoje slowo to: "); printf(slowo); printf("\n"); // ten sposób ma pewne wady [/code]

lub %s jak podał wyżej Fiolek

Wyjąłeś z kontekstu. Ten fragment co podałeś owszem jest niepoprawny. Ten co ja podałem jest poprawny i często właśnie tak się pisze.

char slowo[]="Ala ma kota";printf(slowo); [/code][b]Ryan[/b], idąc tropem twojego rozumowania to:[code=php]printf("Twoje slowo to: "); 
też jest niepoprawne, bo napis w cudzysłowach "może zawierać % i program przestanie zachowywać się poprawnie".

Idąc tym tropem używanie printf jest złe. Złe jest wyłącznie używanie printf() ze zmienną ale bez ciągu formatującego (chyba że, tak jak w dyskusji o scanf, koniecznie musisz dynamicznie zbudować sobie ciąg formatujący; tyle że IMO w poprawnie napisanym kodzie coś takiego nie powinno mieć nigdy miejsca). Tak swoją drogą - "Twoje slowo to: " jest ciągem formatującym, bezparametrowym. Zgadzają się ze mną np. deweloperzy GCC - to zła praktyka i nie powinna być zachęcana.

Naprawdę nie widzisz różnicy pomiędzy:

    char *slowo;    ... // tu kod przydzielający pamięć oraz wczytujący dane do zmiennej: slowo    printf(slowo); [/code]a
[code=php]    char slowo[]="Ala ma kota";    printf(slowo); ?



Jeżeli w pierwszym przypadku całkowicie z tobą się zgadzam oraz z deweloperami GCC bo właśnie o tym mowa. To w drugim przypadku to zupełnie co innego, jedynie trzeba pamiętać o uważnym stosowaniu znaku '%' (co zresztą podkreśliłem ten sposób ma pewne wady)

Ślepota nie boli. Cóż, nie mogę się nie zgodzić. Widząc printf(“Twoje slowo to: “); printf(slowo); printf(”\n”); założyłem, że słowo jest zadeklarowane char *slowo; i potraktowałem niezależnie od pozostałych komentarzy do kodu (że {} są zbędne). :oops:

Dziękuje Wam za wypowiedz i za pomoc. Tego mi było potrzeba. Dzięki jeszcze raz :wink:

Dodane 21.09.2009 (Pn) 10:11

Jeszcze Was troszkę po mecze :stuck_out_tongue:

Pytanie moje brzmi jak mam zrobić by np. imię podać do pustej tablicy? Tzn. do tablicy dynamicznej i chciałbym ją odczytać (to mógł bym zrobić np. printf(tablica); no nie ? ). A jak mam odczytać wielkość tej tablicy po wczytaniu wyrazu bądź tekstu ? Wiem że chyba to powinno być za pomocą “sizeof” ale za bardzo nie wiem jak tego użyć akurat przy tablicy dynamicznej :-/

Długość ciągu znaków(c-stringu) “liczy się” za pomocą funkcji strlen.

Dla tablicy dynamicznej (w języku C) niema sposobu “obliczenia” długości.

Musi być zapamiętywana podczas przydzielenia pamięci w osobnej zmiennej lub jakoś wyliczana z zapisanych do tablicy danych.

EDIT:

NP jeżeli to tablica char i przydzielono pamięci dokładnie tyle aby umieścić napis to można posłużyć się wyrazem:

strlen(tb)+1; [/code]

@up: Jeśli przydzielono _DOKŁADNIE_ tyle aby pomieścić napis(bez końcowego znaku ‘\0’) to strlen zwróci dziwną wartość, zależnie od tego co jest w pamięci za napisem. Ewentualnie będziemy mieli jakiś access violation. A jeśli jest w tablicy znak ‘\0’ to strlen zwróci ilość znaków, więc nie wiem po co to “+1” :wink:

Plus ten jeden znak ‘\0’. Przecież kolega chce czegoś ala sizeof() dla tablicy dynamicznej.

Racja, choć nie zmienia faktu, że sizeof dla dynamicznego ciągu znaków jest bez sensu.

@Fiołek: ciągi znaków w poprawnie napisanym kodzie albo będą zero-terminated, albo będą typu z prefixem określającym długość (tak jak np. typ BSTR). Jeśli trzymasz w kodzie ciąg znaków (w sensie: tekst) bez możliwości odczytania jego długości, prosisz się o kłopoty.

Niestety Win32 ma kilka API, które zwracają ciągi bez gwarancji, że kończą się zerem (głównie API do odczytu z rejestru). Na szczęście każde takie API zwraca dodatkowo długość ciągu (zmusza to niestety do budowania dodatkowego bufora i budowy ciągu, który będzie się kończył zerem).

Nie trzymam tekstu w kodzie inaczej niż c-stringi(nie lubię wymysłów typu BSTR), o to się nie martw :wink:

Napisałem “sizeof dla dynamicznego ciągu znaków jest bez sensu”, gdyż jeśli nie jest null-terminated to pewno mamy gdzieś zapisaną jego długość(albo jest ona skądś zwracana) i nie potrzebujemy dodatkowo liczyć długości. A jeśli to jest null-terminated string to albo wiemy jaką ma długość maksymalną(co często jest rzeczywistą długością tekstu) albo liczymy ją sobie. Jeśli nie znamy długości i nie możemy jej poznać, to jest to błąd.

Hmm… troszkę mi się pomieszało już w sumie :wink:

Potrzebowałem tą długość tablicy do zadania. W sumie może Wam pokaże to zadanie :wink: Może ja coś źle zrozumiałem albo tłumaczę.

http://www.fotosik.pl/pokaz_obrazek/8691cb675fafad3b.html

Chodzi i zadanie 1. Wprowadzam wyraz jednak wyraz może być różnej długości. Wiec mi się wydaje ze do tego powinna być tablica dynamiczna. Stąd moje pytania. Proszę zobaczcie zadanie. Bo jak bym miał długość tablicy po wpisaniu słowa to by nie powinno być problemu z tym zadaniem 1.

Indeks ostatniego znaku to:

strlen(text)-1[/code]

Poniższy kod wykryje jako palindrom nawet napis

KOBYŁA ma mały bok

niezależnie od ilości spacji pomiędzy słowami:

[code=php]char pltoupper(char c)
  {
   c=toupper©;
   char pl[]="\xA4\x8F\xA8\x9D\xE3\xE0\x97\xBD\x8D\xA5\x86\xA9\x88\xE4\xA2\x98\xBE\xAB",*p=strchr(pl+9,c);
   return p?*(p-9):c;
  }
  
(char c) { return strchr(" \t\r\n",c)?1:0; }