【问题标题】:the famous scanf() new line issue著名的 scanf() 换行问题
【发布时间】: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 问题。你有著名的=== 不一样的问题。

标签: c scanf newline


【解决方案1】:

在函数leerePuffer() 中,将ch == getchar() 更改为ch = getchar()

【讨论】:

    【解决方案2】:

    这行有错别字

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

    应该是的

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

    ch == getchar() 会给出01,因为这是一个比较。

    如 cmets 中所述,getchar() 返回一个 int。不是char。如果getchar() 返回EOFchar 就不行了。

    看看here

    此外,无需在 C 中显式转换 malloc() 的返回值。 请参阅this 帖子。

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 2012-01-09
      • 2017-10-03
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多