C-fgets()删除用户输入

时间:2016-10-01 22:22:36

标签: c scanf fgets

我正在尝试收集用户输入但我的“标题”正在逐渐消失。如果我评论“评级”和“年份”的fgets,它不会被消灭。我不明白为什么?

另外,使用fgets时我的int输出不正确(参见输出)。但如果我使用scanf就是。那是为什么?

MOVIE.C

[Inject]
public ILogService LogService { get; set; }

MOVIE.H

var logService = (ILogService)DependencyResolver.Current.GetService(typeof(ILogService));
filters.Add(new ExceptionLoggerFilter(logService));

MAIN.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);
    }
  • INPUT

名称:蝙蝠侠
输入董事姓名:Spielberg
输入电影评级:R
输入电影年份:2000年

  • 输出

名称:
导演:斯皮尔伯格
评级,R
年:808464434

1 个答案:

答案 0 :(得分:6)

看看这个:

#define SIZE_LIMIT 25
//                 ^^

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

只需使用SIZE_LIMIT而不是50。

(您还应该使用mvi->title&mvi->title[0]代替&mvi->title,否则您会遇到类型错误...您是否包含正确的标题?)

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

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”。