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);
}
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.
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
– Dodane 21.09.2009 (Pn) 10:11 –
Jeszcze Was troszkę po mecze
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 :-/
@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”
@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
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.
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.