Wpis z mikrobloga

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.");

return 0;
}

#naukaprogramowania #codereview #jezykc
H.....s - Napisałem taki o to program, który jakimś cudem działa. Działa ale nie tak ...

źródło: comment_cZKDRQPHbdVo2C3SHiOitAtByd9CY8ZQ.jpg

Pobierz
  • 8
  • Odpowiedz
@Hertesus: bogowie, umieść kod pomiędzy ```` (musiałem umieścić podwójnie, inaczej nie wyświetliłoby znaków), bo się czytać nie da ()

wtedy wyglądać to będzie tak
  • Odpowiedz
@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.


Musisz dostarczyć wskaźnik
  • Odpowiedz
@-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?
  • Odpowiedz
  • 0
Dzięki, za odpowiedź, czyli wystarczy zmienić w ,,scanf("%19s",&dane[i][20])" 20 na 0, tak?


@Hertesus: tak, albo samo &dane[i] powinno wystarczyc :)

dlaczego w tym printf jest konieczne &, i bez tego kod się nie skompiluje?


& zwraca adres podanej mu zmiennej,
  • Odpowiedz
  • 0
@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.
  • Odpowiedz