webForumDet fria alternativet

Varför blir det fel?

C/C++ur C/C++

7 svar · 394 visningar · startad av Proton

Medlem sedan okt. 2000242 inlägg
Frågan#1

Hej,

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.

/Johnny

Medlem sedan juli 2000212 inlägg
#2

Kanske fungerar bättre om du läser in en char istället för en c-sträng:

scanf("%c", &korkort);

Medlem sedan okt. 2000242 inlägg
#3

Provade det, men då läste programmet aldrig in nästa fråga..

Frågan..
scanf("%c", &bolaget); kan man ge ett svar på..

scanf("%c", &korkort); hoppas över...

/Johnny

Medlem sedan juni 200010 432 inlägg
#4

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().

Medlem sedan okt. 2000242 inlägg
#5

Tack PeW, jag är med på hur du menar.. Du skulle inte vilja utveckla (omvandla) koden ovan med getchar()? Vore hyggligt..

/Johnny

Medlem sedan juni 200010 432 inlägg
#6

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

Medlem sedan maj 20021 466 inlägg
#7

Eller helt enkelt ersätta scanf med
int ch = getchar();

Medlem sedan feb. 20002 300 inlägg
#8

Eller:

fflush(stdin);
129 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)