знаменитая проблема с новой строкой scanf () - PullRequest
0 голосов
/ 28 апреля 2018

Код немецкий, но в данном случае это не имеет значения:

У меня есть известная проблема с новой строкой scanf () (хотя она известна, я не смог найти никакого решения). Я видел этот код в видео на YouTube, и в видео код работал. Но на моем ПК код не работает, потому что моя функция scanf () не распознает, что я хочу ввести свою строку после нажатия «ENTER». Строка, о которой я говорю, комментируется как «ПРОБЛЕМА ЗДЕСЬ»

//
//  main.c
//  list
//
//  Created by Programmieren on 28.04.18.
//  Copyright © 2018 Semih. All rights reserved.
//

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

struct todo{
    char aufgabe[100];
    int tag;
    int monat;
    int jahr;
    struct todo *next;
};

void leerePuffer()
{
    char ch;
    while ((ch == getchar()) != '\n' && ch != EOF);
}


//Prototyp

void ausgabe(struct todo *anfang);
struct todo *neues_element(struct todo *anfang);

int main(int argc, const char * argv[]) {
    int wahl;

    struct todo *anfang = NULL;

    do
    {
        printf("Menu\n");
        printf("1 - Ausgeben der ToDo's\n");
        printf("2 - Eingeben eines neuen Elements\n");
        printf("0 - Beenden\n");
        printf("Bitte geben Sie ihre Wahl ein: ");

        scanf("%d", &wahl);

        switch (wahl)
        {
            case 1:
                ausgabe(anfang);
                break;
            case 2:
                anfang = neues_element(anfang);
                break;
            case 0:
                break;
            default:
                printf("Keine gültige Auswahl\n");
                break;
        }
    }
    while (wahl != 0);


    return 0;
}

void ausgabe(struct todo *anfang)
{
    struct todo *aktuell = anfang;
    int counter = 0;

    while (aktuell != NULL)
    {
        counter++;
        printf("%02d: %50s %02d.%02d.%04d\n", counter, aktuell->aufgabe, aktuell->tag, aktuell->monat, aktuell->jahr);

        aktuell = aktuell->next;

    }
}

struct todo *neues_element(struct todo *anfang)
{
    struct todo *neu = NULL;
    neu = (struct todo *)malloc(sizeof(struct todo));
    if (neu == NULL) {
        printf("Kein Speicher mehr da!\n");
        return anfang;
    }
    else{
        printf("Geben Sie die Daten ein:\n");

        printf("Aufgabentext: \n");
        leerePuffer();
        //THE PROBLEM IS HERE: !!!!!!!!!!!!!!!!!!!!##############
        scanf("%99[^\n]", neu->aufgabe);

        printf("Deadline Tag: ");
        scanf("%d", &(neu->tag));
        printf("Deadline Monat: ");
        scanf("%d", &(neu->monat));
        printf("Deadline Jahr: ");
        scanf("%d", &(neu->jahr));

        neu->next = anfang;

        return neu;

    }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

В строке есть опечатка

while ((ch == getchar()) != '\n' && ch != EOF);

Это должно было быть

while ((ch = getchar()) != '\n' && ch != EOF);

ch == getchar() даст либо 0, либо 1, так как это сравнение.

И, как отмечено в комментариях, getchar() возвращает int. Не char. В случае, если getchar() вернет EOF, char не пойдет.

Взгляните здесь .

Кроме того, нет необходимости явно приводить возвращаемое значение malloc() в C. Смотрите этот пост.

0 голосов
/ 28 апреля 2018

В функции leerePuffer() изменить ch == getchar() на ch = getchar().

...