Det är 3:e timman med C någonsin för mig just nu så det blir säkert enkelt för ngn av er att lista ut detta.
Jag har detta program som jag pillat i hop för att testa booleska operatorer...
#include <stdio.h>
int main()
{
char bolaget;
char korkort;
printf("Far du kopa sprit pa bolaget? j/n: ");
scanf("%s", &bolaget);
printf("Har du korkort? j/n: ");
scanf("%s", &korkort);
if( bolaget == 'j' && korkort == 'j' )
printf("\nDu ar alltsa 20 ar eller over och har korkort!\n");
else if( bolaget != 'j' && !(korkort == 'j') )
printf("\nDu ar inte 20 ar gammal och saknar korkort! Looser....\n");
else
printf("\nDu ar 20 ar eller over, eller sa har du korkort.\n");
return 0;
}
Om jag gör som ovan verkar aldrig variabeln bolaget att tildelas ngt.
Vänder jag däremot på dem så att det blir..
#include <stdio.h>
int main()
{
char bolaget;
char korkort;
printf("Far du kopa sprit pa bolaget? j/n: ");
scanf("%s", &korkort);
printf("Har du korkort? j/n: ");
scanf("%s", &bolaget);
if( bolaget == 'j' && korkort == 'j' )
printf("\nDu ar alltsa 20 ar eller over och har korkort!\n");
else if( bolaget != 'j' && !(korkort == 'j') )
printf("\nDu ar inte 20 ar gammal och saknar korkort! Looser....\n");
else
printf("\nDu ar 20 ar eller over, eller sa har du korkort.\n");
return 0;
}
Så fungerar programmet precis som det ska?! Både korkort och bolaget tilldelas en character och det blir rätt i alla kombinationer.
Varför tusan blir det så? Vad är skillnaden? Editor & kompilator är från Dev-C++. Jag har INTE testat koden med annan kompilator för att utesluta det.
Men om du petar in en sträng (%s) beståendes av ett "j" eller "n" så blir det 2 tecken iom termineringstecknet som läggs in. Dvs att ett "j" är egentligen [ j | 0 ]. Så det du gör när du skriver
printf("Har du korkort? j/n: ");
scanf("%s", &korkort);
är att du skriver över den första variabeln med variabel 'korkorts' terminering (NULL). Om det råkar fungera bara för att du vänder på steken är det bara för att du har tur som inte skriver över något signifikant i minnet. Samma program skulle då kunna ge segmentfel eller liknande om det kördes på en annan plattform.
Det är korrekt att istället använda %c. Alternativt att du deklarerar input variablerna som strängar istället eller använder en egen buffer för inmatningen. Du skulle även kunna snegla på getchar() snarare än scanf().
Enklast är att kasta in getchar(); mellan dina frågor. Då rensas input-bufferten från tangentbordet som innehåller NULL från din första fråga, vilket i sin tur gör att inläsningen avbryts iom att funktionen scanf läser att inmatningen är klar (fast den inte är det).