5 svar
107 visningar
Didar 212
Postad: 6 okt 2022 18:52

user ska ange både namn antal och enhet Funktionen ska placera varan i arrayen på nästa lediga plats

Hej, jag har fastnat och behöver tips på hur jag ska göra, nedan ser ni mina filer av kod.

Som ni ser så har jag lagt in min printf sats i shoppinglist [c] på första bilden men antar att det är fel. Jag tänker att jag vill ju att användaren ska först frågas om vilket alternativ den vill välja, sen användaren väljer "add an item" så ska det skrivas ut följande som jag har skrivit där uppe.

anders_k 237
Postad: 6 okt 2022 19:51 Redigerad: 6 okt 2022 19:55

Du får en pekare in i addItem till shoppingList, i den har du en array[5] of GroceryItem

Du kan göra så här (har utelämnat I/O):

void addItem(struct ShoppingList* list)
{
  // se till så att det finns plats.
  if (list->length < 4)              // eller sizeof(list->itemList)/sizeof(List->itemList[0]) - 1
  {
    // här får du läsa in fr. tangentbordet istället
    // en pekare till platsen i arrayen
    GroceryItem* item = list->itemList + list->length; // samma som &itemList[list->length]
    // initialisera structen
    strcpy(item->productName, "namn" );
    item->amount = 42;
    item->unit = 'g';
    // gör plats för nästa element
    list->length++; 
  }
} 

När du läser meny numret, gör dig en tjänst och använd " %d" istället för "%d" för att slippa skräp i bufferten mellan varje loop iteration. Annars det mer robusta sättet att läsa från tangentbordet är att använda fgets och sscanf.

char buffer[512];
if (fgets(buffer,sizeof(buffer),stdin) != NULL)
{
  if (sscanf(buffer, "%d", &option ) != 1)
  {
     ...error...
  }
}

helst stoppa det i en egen funktion.

Laguna Online 30711
Postad: 6 okt 2022 19:58

Jag lärde mig själv för 35 år sedan att aldrig någonsin använda scanf. Det har nog sparat mycket elände åt mig.

anders_k 237
Postad: 7 okt 2022 10:57 Redigerad: 7 okt 2022 10:58
Laguna skrev:

Jag lärde mig själv för 35 år sedan att aldrig någonsin använda scanf. Det har nog sparat mycket elände åt mig.

Precis så är det, jag antar de som lär ut C tror det är ett bra sätt att plåga elever med.

Fermatrix 7841 – Fd. Medlem
Postad: 7 okt 2022 18:17 Redigerad: 7 okt 2022 18:17

scanf är nog det vanligaste bland nybörjade både på youtube, google men mera. Jag tror att man oftast tänker att man inte ska översvämma nybörjare med mycket information. Många finner det ju svårt att deklarera en variabel osv. Kan man förvänta sig att nubörjare ska inse faran i vissa funktioner de använder?

Det finns många funktioner som man använder som inte borde används. Exempelvis är det vanligt att man gör att lär ut gets, vilket också är en farlig funktion att använda. strncpy() får också många klagomål men detta används flitigt när man lär ut C till nybörjare ändå.

Och andrasidan kanske man bara ska lära eleverna rätt från början, de behöver inte veta detaljen varför man ska använda fgets istället för gets osv så det finns nog ingen ursäkt heller att låta elever använda funktioner som kan vara extremt farliga.


@Didar, hur kommer det sig att du har en:

#define _CRT_SECURE_NO_WARNINGS

Är det för att du får en varning på scanf?

En annan kommentar, gör dig själv en stor tjänst och använd typedef på dina structs. 


typedef struct Point{
  int x;
  int y;
} Point;
int main() {
    Point p1;
    p1.x = 1;
    p1.y = 3;
    printf("%d \n", p1.x);
    printf("%d \n", p1.y);
    return 0;
}

I jämförelse med: 

struct Point{
  int x;
  int y;
};
int main() {
    struct Point p1;
    p1.x = 1;
    p1.y = 3;
    printf("%d \n", p1.x);
    printf("%d \n", p1.y);
    return 0;
}
Didar 212
Postad: 8 okt 2022 19:13
Dracaena skrev:

scanf är nog det vanligaste bland nybörjade både på youtube, google men mera. Jag tror att man oftast tänker att man inte ska översvämma nybörjare med mycket information. Många finner det ju svårt att deklarera en variabel osv. Kan man förvänta sig att nubörjare ska inse faran i vissa funktioner de använder?

Det finns många funktioner som man använder som inte borde används. Exempelvis är det vanligt att man gör att lär ut gets, vilket också är en farlig funktion att använda. strncpy() får också många klagomål men detta används flitigt när man lär ut C till nybörjare ändå.

Och andrasidan kanske man bara ska lära eleverna rätt från början, de behöver inte veta detaljen varför man ska använda fgets istället för gets osv så det finns nog ingen ursäkt heller att låta elever använda funktioner som kan vara extremt farliga.


@Didar, hur kommer det sig att du har en:

#define _CRT_SECURE_NO_WARNINGS

Är det för att du får en varning på scanf?

En annan kommentar, gör dig själv en stor tjänst och använd typedef på dina structs. 


typedef struct Point{
  int x;
  int y;
} Point;
int main() {
    Point p1;
    p1.x = 1;
    p1.y = 3;
    printf("%d \n", p1.x);
    printf("%d \n", p1.y);
    return 0;
}

I jämförelse med: 

struct Point{
  int x;
  int y;
};
int main() {
    struct Point p1;
    p1.x = 1;
    p1.y = 3;
    printf("%d \n", p1.x);
    printf("%d \n", p1.y);
    return 0;
}

#defince_crt_secure no warnings har min lärare skrivit till, detta är en funktion som vi har fått utgå ifrån och bygga vidare från det. Antar att hon har skrivit dit den för att vi inte ska få varningar.

Svara
Close