Anfänger steht im Wald

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
NewZip
Beiträge: 1
Registriert: Mo Jan 27, 2020 8:12 pm

Anfänger steht im Wald

Beitrag von NewZip » Mo Jan 27, 2020 8:31 pm

Hallo Zusammen,

ich versuche aktuell C zu lernen. In PHP fühle ich mich schon firm, Grundwissen der Programmierung ist also vorhanden.
Dennoch hänge ich an einem Problem fest.

Die Aufgabe
Ich möchte, dass der Anwender bis zu 10 Zahlen eingeben kann. Da er auch weniger Zahlen eingeben kann soll es ein Abbruch-Kriterium geben: Der Buchstabe 'A'.
Die eingegebenen Zahlen sollen direkt nach der Eingabe in einem Array (zahlen) gespeichert werden.

Code: Alles auswählen

#include<stdio.h>

int main() {
    char *zahlen[10];
    char lchar[2] = "";
    int i;

    printf("Bitte Zahl zwischen 1 und 10 eingeben.\n");
    printf("'A' beendet die Eingabe\n");

    //Schleife zum 10-maligem Lesen einer Zahl / dem Buchstaben 'A'
    for(i = 0; i < 10; i++) {
        //Erwartung: i ist 0, 1, 2, 3, ...
        printf("%d: Bitte Zahl eingeben: ", i);

        //speichert User-Input in Variable 'lchar'
        scanf("%s", &lchar);

        //Zum Testen gebe ich die Zahl erneut aus. -> Kann nachher weg.
        printf("Zahl: '%s'\n", lchar);

        //Pruefe ob User-Input == A, wenn ja, dann Ende der Schleife
        if(!strcmp(lchar, "A")) {
                printf("BREAK\n");
                break;
        } else {
           //lchar in derm Array speichern
           zahlen[i] = lchar;
        }
    }

    //tippe ich 1, 2, 3, A ein, so ist meine erwartete Ausgabe '1', da die erste Zahl eine 1 war.
    printf("zahlen[0]: %s\n", zahlen[0]);
    //Trotzdem wird 'A', also der letzte Wert ausgegeben.

    return 0;
}
Könnt Ihr den Fehler finden?
Danke!!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Anfänger steht im Wald

Beitrag von nufan » Di Jan 28, 2020 9:04 am

Hallo NewZip!
Hier haben sich mehrere kleine Fehler eingeschlichen.
NewZip hat geschrieben:
Mo Jan 27, 2020 8:31 pm

Code: Alles auswählen

char *zahlen[10];
Du legst hier ein Array mit 10 Zeigern an. Für die Zeichenketten selbst reservierst du allerdings keinen Speicher. Willst du nur eine einzige Ziffer pro Eingabe, würde die Definition so aussehen:

Code: Alles auswählen

char zahlen[10][2];
Du benötigst 2 Byte an Speicher, weil du den String mit einem Null-Byte terminieren musst. Details dazu findest du in unserem C-Tutorial.

Abgesehen davon heißt dein Array "zahlen". Ein Array "zahlen" zu haben das Zeichen speichert, ist inhaltlich etwas widersprüchlich. Sinnvoller wäre es, ein Array vom Typ "int" anzulegen und die Eingaben nach Überprüfung der Abbruchbedingung bei Bedarf mit der Funktion atoi() zu konvertieren.
NewZip hat geschrieben:
Mo Jan 27, 2020 8:31 pm

Code: Alles auswählen

scanf("%s", &lchar);
"lchar" ist bereits ein Array, du solltest den Adress-Operator "&" deshalb weglassen.
NewZip hat geschrieben:
Mo Jan 27, 2020 8:31 pm

Code: Alles auswählen

zahlen[i] = lchar;
Zeichenketten können nicht so einfach zugewiesen werden, hierfür kann die Funktion strncpy() verwendet werden.

Antworten