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()
函数读取字符串,但 rating
和 year
都不是字符串。这就是 scanf()
正常工作的原因,因为您可以使用 scanf()
来读取整数。
为什么是 808464434?
因为808464434是字符串“2000”解释为整数,0x30303032。 0x30是ASCII中的字符'0',0x32是ASCII中的字符'2'。
我正在尝试收集用户输入,但我的 "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()
函数读取字符串,但 rating
和 year
都不是字符串。这就是 scanf()
正常工作的原因,因为您可以使用 scanf()
来读取整数。
为什么是 808464434?
因为808464434是字符串“2000”解释为整数,0x30303032。 0x30是ASCII中的字符'0',0x32是ASCII中的字符'2'。