Vinnaren i pepparkakshustävlingen!
2015-11-26, 23:58
  #1
Medlem
Någon som snabbt vill svara enkelt på varför jag inte får den andra frågan när jag kompilerat koden, utan bara den första? Tack!


#include <stdio.h>
#include <stdlib.h>

int main()

{
char namn;
int alder;
printf("Vad heter du?\n");
scanf("%c", &namn);

printf("hur gammal är du?\n");
scanf("%d", &alder);
system("pause");
return 0;
}
Citera
2015-11-27, 08:10
  #2
Moderator
RostigHinks avatar
Ditt namn är en variabel som rymmer ett enda tecken. Du behöver en vektor av tecken. Ett sätt är som följer:
Kod:
#include <stdio.h>
#include <stdlib.h>

int main()

{
  char* namn = malloc(32 * sizeof(char));
  int alder;
  printf("Vad heter du?\n");
  scanf("%s", namn);

  printf("hur gammal är du?\n");
  scanf("%d", &alder);
  //  system("pause");

  return 0;
}

Det som hände i ditt program är att första scanf() läste exakt ett tecken och resten går vidare till andra scanf().
__________________
Senast redigerad av RostigHink 2015-11-27 kl. 08:13.
Citera
2015-11-29, 15:06
  #3
Medlem
OBS malloc ska alltid ha en matchande free! Annars läcker skeppet.
Citera
2015-11-29, 15:54
  #4
Medlem
Citat:
Ursprungligen postat av trekantshatt
OBS malloc ska alltid ha en matchande free! Annars läcker skeppet.
alltid är en överdrift, men man skall tänka på att allokering finns kvar tills free(), eller tills progammet stängs av. OS'et skall se till att allt som är allokerat av en process skall frias när processen avslutas.

I detta fall görs bara malloc en gång, sen avslutas programmet. Man kan ha ett personligt systematiskt synsätt att malloc och free alltid skall finnas och matcha, men skeppet läcker inte här.
__________________
Senast redigerad av lvedin 2015-11-29 kl. 16:07. Anledning: +
Citera
2015-11-29, 22:49
  #5
Medlem
Citat:
Ursprungligen postat av lvedin
alltid är en överdrift, men man skall tänka på att allokering finns kvar tills free(), eller tills progammet stängs av. OS'et skall se till att allt som är allokerat av en process skall frias när processen avslutas.

I detta fall görs bara malloc en gång, sen avslutas programmet. Man kan ha ett personligt systematiskt synsätt att malloc och free alltid skall finnas och matcha, men skeppet läcker inte här.
Ja det har du rätt i. Här när man hårdkodar storleken kanske det är bättre att ha en statiskt allokerad array i övrigt.
__________________
Senast redigerad av trekantshatt 2015-11-29 kl. 22:51.
Citera
2015-11-30, 08:24
  #6
Medlem
sganderss avatar
I C när du skriver tecken så läggs dessa i en buffert

scanf läser från den bufferten, men den läser bara vad du säger till den att läsa.

m.a.o.

när du kör programmet

Kod:
int n = 0;
printf(">");
scanf("%d",&n);

Citat:
>38[ENTER]

så ligger ENTER också i bufferten (som beroende på ditt operativ system kan vara ett eller två tecken)

När det andra scanf påträffas ligger ENTER kvar och när du föröker läsa från bufferten så returnerar scanf 0 m.a.o. inget läst.

Det är därför bra att alltid kolla retur värdet av scanf (och andra runtime funktioner)

Som alternativ kan du istället använda fgets för att läsa från tangentbordet och sedan sscanf för att läsa ut:

Kod:
char input[64];
if (fgets(input,sizeof(input),stdin) != NULL)
{
  if (sscanf(input,"%d",&n) == 1)
  {
    printf("%d lästes",n);
  }
}
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback