我正在尝试收集用户输入但我的“标题”正在逐渐消失。如果我评论“评级”和“年份”的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);
}
名称:蝙蝠侠
输入董事姓名:Spielberg
输入电影评级:R
输入电影年份:2000年
名称:
导演:斯皮尔伯格
评级,R
年:808464434
答案 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()
函数读取字符串,但rating
和year
都不是字符串。这就是scanf()
正常工作的原因,因为您可以使用scanf()
来读取整数。
因为808464434是字符串“2000”,被解释为整数,0x30303032。 0x30是ASCII中的字符“0”,0x32是ASCII中的字符“2”。