C- fgets() 擦除用户输入

C- fgets() erasing user input

我正在尝试收集用户输入,但我的 "Title" 正在消失。如果我注释掉 "Rating" 和 "Year" 的 fgets,它不会被清除。我不明白为什么?

此外,当使用 fgets 时,我的 int 输出不正确(请参阅输出)。但是如果我使用 scanf 就是这样。这是为什么?

MOVIE.C

    #include <stdio.h>
    #include <stdlib.h>
    #include "movie.h"

    void print_movie(const movie_t * mvi) {
        printf("Title:%s", mvi->title);
        printf("Director:%s", mvi->director);
        printf("Rating:%c\n", mvi->rating);
        printf("Year: %d\n", mvi->year);
    }

    void get_movie(movie_t * mvi) {
        printf("Title:");
        fgets(&mvi->title, 50, stdin);
        printf("Enter Director Name:");
        fgets(&mvi->director, 50, stdin);
        printf("Enter Movie Rating:");
        fgets(&mvi->rating,5, stdin);
        printf("Enter Movie Year:");
        fgets(&mvi->year, 5, stdin);
        //scanf will output correct year
        //scanf("%d",&mvi->year);
    }

MOVIE.H

#ifndef MOVIE_H
#define MOVIE_H
#define SIZE_LIMIT 25
#define RATING_SIZE 5

typedef enum {G, PG, PG13, R} rating_t;

typedef struct {
    char rating;
    char title[SIZE_LIMIT];
    char director[SIZE_LIMIT];
    int year;
}movie_t;


void get_movie(movie_t * movie);
void print_movie(const movie_t * movie);

#endif /* MOVIE_H

MAIN.C

#include "movie.h"

int main(){ 
movie_t movie;
movie.year = 0;
get_movie(&movie);
print_movie(&movie);
return 0;
}

作品名:蝙蝠侠
输入导演 Name:Spielberg
进入电影 Rating:R
进入电影 Year:2000

标题:
Director:Spielberg
Rating:R
年份:808464434

看看这个:

#define SIZE_LIMIT 25
//                 ^^

fgets(&mvi->title, 50, stdin);
//                 ^^

只需使用 SIZE_LIMIT 而不是 50。

(你也应该使用mvi->title&mvi->title[0]而不是&mvi->title,否则你会出现类型错误......你包括正确的headers吗?

此外,这些都是完全错误的:

fgets(&mvi->rating,5, stdin);
fgets(&mvi->year, 5, stdin);

您可能需要使用 scanf() 或其他方式。 fgets() 函数读取字符串,但 ratingyear 都不是字符串。这就是 scanf() 正常工作的原因,因为您可以使用 scanf() 来读取整数。

为什么是 808464434?

因为808464434是字符串“2000”解释为整数,0x30303032。 0x30是ASCII中的字符'0',0x32是ASCII中的字符'2'。