4 svar
102 visningar
erze7811 102
Postad: 19 dec 2022 21:50 Redigerad: 19 dec 2022 21:51

Gcvwr

Jag pluggar inför tenta och försöker lösa denna uppgift:

Jag har gjort program som fungerar och klarar sample imput 1 och 2 men när jag lämnar in det blir det fel. Undrar vad jag har gjort för fel?

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

int main() {
    char buffer[100] = {0}; 
    int G,T,N = 0;
	int w = 0;
    int sum = 0;
    int skillnad = 0;
    int total = 0;
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer,"%d %d %d\n", &G, &T, &N);
    
	for(int i = 0; i < N; i++) {
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer, "%d", &w); 
        sum += w;// summan av items
    }
    if(T <= G - 2000) {
        skillnad = (G-T)*0.9;
        total = skillnad - sum;
            
    }
    else {
      skillnad = G - T;
        total = skillnad - sum;
    }
    printf("%d\n", total);
    return 0;
}
anders_k 237
Postad: 21 dec 2022 22:13 Redigerad: 21 dec 2022 22:18

Det blir fel för att du loopar över fgets för att läsa in de individuella vikterna.

fgets läser en hel rad åt gången.

Gör så här istället t.ex.

// läs in raden, parsa innehållet
fgets(buffer, sizeof(buffer),stdin);
for (char* tok = strtok(buffer," "); tok != NULL; tok = strtok(NULL, " \n"))
{
  sum += atoi(tok);
}

alt. använd N om du måste genom att själv parsa strängen, men strängt taget behövs inte N för att ta reda på hur många vikter som kommer på raden.

 

erze7811 102
Postad: 22 dec 2022 21:46

Hur fungerar strtok och varför sätter du den lika med char* tok? Och varför ska man sätta tok till inte är lika med NULL?

anders_k 237
Postad: 22 dec 2022 23:49

strtok splittar en sträng i tokens, andra argumentet är vad för skiljetecknen som skall användas mellan tokens

tok = strtok(buffer, " \n");  // skiljetecken kan vara mellanslag eller linefeed.

så ovan ger första token dvs det första nummret i strängen, för att få de nästföljande nummren sätter ger man NULL som första parameter, då kommer strtok att fortsätta på samma sträng (strtok har en statisk pekare som kommer ihåg var man var sist). Varje gång du anropar strtok levererar den en token tills den returnerar NULL.

anders_k 237
Postad: 23 dec 2022 05:51 Redigerad: 23 dec 2022 05:54

Du kan använda strtok till att splitta vilken sträng som helst om den har skiljetecken mellan det du vill plocka ut.

char buf[] = "1,2,3"
char* token = strtok( buf, ","); // 1
token = strtok(NULL, ","); // 2
token = strtok(NULL, ","); // 3

Man skall bara vara försiktig när det gäller trådning för den vanliga strtok är inte trådsäker. dvs om två olika trådar använder strtok blir det fel.

En annan sak att tänka på är den första parametern i strtok(buf,",") kommer att modifieras så man kan inte skicka in en literal

dvs

char* invalid = "1,2,3";
char* token = strtok( invalid, ","); // undefined behavior
Svara
Close