2 svar
49 visningar
Hassoni123 behöver inte mer hjälp
Hassoni123 4
Postad: 26 nov 2022 07:04

Får inte rätt output - For Loop

Hejsan!

Har problem med en uppgift som jag har försökt få lösningen till nu väldigt länge. Håller tålamodet uppe :) Uppgiften är att skriva ett program där man
1. Matar in tal och adderar det till en summa.
2. Vid varje inmatning skall summan skrivas ut.
3. Programmet ska avslutas när man matar in 0.

Exempelvis:

Input: 1,2,3,4,5,0

Output: 1,3,6,10,16

 

#include <stdio.h>
int main(){

int n;
int i;
int sum = 0;

for(i=0; i<=n; i++){
scanf("%d\", &i);
if(n==0)
break;
sum += i;

printf("%d\n", sum);

}

return 0;

 

}

 

Jag har försökt och titta in i andra bibliotek än stdio.h utan någon vidare lycka och jag förstår inte varför inte min if-sats tar slut på loopen innan printf()-satsen kickar igång.

anders_k 237
Postad: 26 nov 2022 08:14 Redigerad: 26 nov 2022 08:19

Du skriver inte direkt vad det är som inte fungerar, det är alltid
bra att göra.

Men jag antar att problemet är scanf

I C, när man matar in värden från tangentbordet hamnar de i en
teckenbuffer, varje tecken du matar in från tangentbordet landar
där, också när du trycker på ENTER så hamnar det tecknet där
(\r\n eller \n beroende på vilket operativsystem du kör).

Du skriver "1" och trycker ENTER
I bufferten står det: '1',ENTER
scanf läser ut 1
Nästa loop:
scanf hittar ENTER och fallerar

scanf läser från bufferten men eftersom du inte har specificerat
en "format specifier" ("%d") som tar hand om andra tecken än tal så
kommer scanf att inte kunna hitta fler tal än det första talet förrän
bufferten är tom igen.

tip : Kolla returvärdet från scanf den returnerar hur många
värden den lyckades parsa. Rent generellt är det alltid bra
att kolla returvärden från funktioner som har returvärde för
att kolla hur det gick.

Så antingen ändrar du din format specificering, det räcker med att du
lägger till ett mellanslag framför: " %d" då ignoreras alla andra
tecken än talet när parsar den bufferten.

Eller så läser du från tangentbordet med hjälp av fgets och sedan
använder sscanf för att läsa ut värdet - vilket är det mer robusta
sättet att läsa värden från tangentbordet (nu behövs inte " %d"
eftersom du läser från en array inte bufferten så den är ny varje
gång):

char buf[256];
if (fgets(buf,sizeof(buf),stdin) != NULL)
{
  if (sscanf( buf, "%d", &i ) == 1)
  {
    if (i == 0) 
    {
      break;
    }
    else
    {
      sum += i;
    }
  }
}
Hassoni123 4
Postad: 26 nov 2022 08:20
anders_k skrev:

Du skriver inte direkt vad det är som inte fungerar, det är alltid
bra att göra.

Men jag antar att problemet är scanf

I C, när man matar in värden från tangentbordet hamnar de i en
teckenbuffer, varje tecken du matar in från tangentbordet landar
där, också när du trycker på ENTER så hamnar det tecknet där
(\r\n eller \n beroende på vilket operativsystem du kör).

Du skriver "1" och trycker ENTER
I bufferten står det: '1',ENTER

scanf läser från bufferten men eftersom du inte har specificerat
en "format specifier" ("%d") som tar hand om andra tecken än tal så
kommer scanf att inte kunna hitta fler tal än det första förrän
bufferten är tom igen.

tip : kolla retur värdet från scanf den returnerar hur många
värden den lyckades parsa. Rent generellt är det alltid bra
att kolla returvärden från funktioner som har returvärde för
att kolla hur det gick.

Så antingen ändrar du din format specificering, det räcker med att du
lägger till ett mellanslag framför: " %d" då ignoreras alla andra
tecken än talet när parsar den bufferten.

Eller så läser du från tangentbordet med hjälp av fgets och sedan
använder sscanf för att läsa ut värdet - vilket är det mer robusta
sättet att läsa värden från tangentbordet:

char buf[256];
if (fgets(buf,sizeof(buf),stdin) != NULL)
{
  if (sscanf( buf, "%d", &i ) == 1)
  {
    if (i == 0) 
    {
      break;
    }
    else
    {
      sum += i;
    }
  }
}

Lyckades lösa problemet nu, tack för hjälpen :)

Svara
Close