【发布时间】:2018-04-28 12:57:50
【问题描述】:
代码是德语,但在这种情况下无关紧要:
我有著名的 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;
}
}
【问题讨论】:
-
一个重要提示:
getchar函数返回一个int。这对于EOF检查很重要。 -
著名的
scanf误用?检查函数返回 -
看看这些可能的候选人:stackoverflow.com/questions/35178520/…sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html 后者不仅告诉你不要使用它,它还解释了很多。
-
至于您的
scanf问题。如果您知道这是一个问题,那么您应该知道您可以添加"%99[^\n]"格式的前导空格,scanf将通过跳过任何前导空格(包括换行符)来处理它。 -
原来你没有著名的
scanf问题。你有著名的=和==不一样的问题。