Napisałem taki o to program, który jakimś cudem działa. Działa ale nie tak dokońca, bo przy wyświetlaniu trzeciego wyrazu zmienia mu literę na następną jaka jest w alfabecie np. z b na c, p na q itd. Wie ktoś jaka jest tego przyczyna? #include #include void wypis(int i) { if(i==0)printf("Podaj imię.\n"); if(i==1)printf("Podaj drugie imię.\n"); if(i==2)printf("Podaj nazwisko.\n"); } int main() { char dane[3][20]; int i; for(i=0;i<3;i++) { wypis(i); scanf("%19s",&dane[i][20]); } printf("\n%s\n%s\n%s\n",&dane[0][20],&dane[1][20],&dane[2][20]); puts("Sprawdź czy dane są poprawne.");
@Hertesus: Całkowicie przypadkiem trafiłem na ten wpis i widzę, że nikt Ci nie pomógł. No kolego powiem Ci, że aż dziwne, że ten program jakkolwiek działa. Zobacz specyfikację funkcji scanf, z której skorzystałeś: http://www.cplusplus.com/reference/cstdio/scanf/
Depending on the format string, the function may expect a sequence of additional arguments, each containing a pointer to allocated storage where the interpretation of the extracted characters is stored with the appropriate type.
@-PPP-: Dzięki, za odpowiedź, czyli wystarczy zmienić w ,,scanf("%19s",&dane[i][20])" 20 na 0, tak? Jeszcze jedna sprawa mnie nurtuje. Może będziesz znał odpowiedź, dlaczego w tym printf jest konieczne &, i bez tego kod się nie skompiluje?
@Hertesus: Funkcje oczekuja zmiennych okreslonych typow. W tym przypadku (%s) jest to char*, czyli wskazanie na zmienna typu char. Zwracajac wartosc bez & zwracasz typ tablicy, ktora zadeklarowales, czyli zwyklego chara. A potrzebujesz wskazanie do pamieci, ktora zarezerwowales na ciag znakow.
Funkcja oczekuje tylko miejsca do zapisania danych, jej nie interesuje wartosc zadnych danych. Chca tylko miejsce do zapisu podawanych jej danych.
Strona główna Allegro na święta 2006, czyli 19 lat temu. Tak, to jest cała strona główna portalu bez żadnych zablokowanych reklam. No i komu kuźwa przeszkadzał taki internet? xD #allegro #internet #webdev #nostalgia #kiedystobylo
zmienia mu literę na następną jaka jest w alfabecie np. z b na c, p na q itd. Wie ktoś jaka jest tego przyczyna?
#include
#include
void wypis(int i)
{
if(i==0)printf("Podaj imię.\n");
if(i==1)printf("Podaj drugie imię.\n");
if(i==2)printf("Podaj nazwisko.\n");
}
int main()
{
char dane[3][20];
int i;
for(i=0;i<3;i++)
{
wypis(i);
scanf("%19s",&dane[i][20]);
}
printf("\n%s\n%s\n%s\n",&dane[0][20],&dane[1][20],&dane[2][20]);
puts("Sprawdź czy dane są poprawne.");
return 0;
}
#naukaprogramowania #codereview #jezykc
źródło: comment_cZKDRQPHbdVo2C3SHiOitAtByd9CY8ZQ.jpg
Pobierzwtedy wyglądać to będzie takPolecam lekturę:
https://google-styleguide.googlecode.com/svn/trunk/cppguide.html
No kolego powiem Ci, że aż dziwne, że ten program jakkolwiek działa. Zobacz specyfikację funkcji scanf, z której skorzystałeś: http://www.cplusplus.com/reference/cstdio/scanf/
Musisz dostarczyć wskaźnik w
Jeszcze jedna sprawa mnie nurtuje. Może będziesz znał odpowiedź, dlaczego w tym printf jest konieczne &, i bez tego kod się nie skompiluje?
@Hertesus: tak, albo samo &dane[i] powinno wystarczyc :)
& zwraca adres podanej mu zmiennej,
typow. W tym przypadku (%s) jest to char*, czyli wskazanie na zmienna typu char. Zwracajac wartosc bez & zwracasz typ tablicy, ktora zadeklarowales, czyli zwyklego chara. A potrzebujesz wskazanie do pamieci, ktora zarezerwowales na ciag znakow.
Funkcja oczekuje tylko miejsca do zapisania danych, jej nie interesuje wartosc zadnych danych. Chca tylko miejsce do zapisu podawanych jej danych.