【发布时间】:2019-09-17 22:12:05
【问题描述】:
此代码应该将用户输入的信息打印到文件中,但它所做的只是创建一个空文件...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct room
{
int room;
char type[9];
int cap;
int price;
}rm;
FILE *k;
int main(){
struct room rm;
k=fopen("rooms.txt","w");
printf("Please enter room number:");
scanf("%d", rm.room);
printf("\nPlease enter a description:");
scanf("%s", rm.type);
printf("\nPlease enter the room capacity:");
scanf("%d", rm.cap);
printf("\nPlease enter the price:");
scanf("%d", rm.price);
fprintf(k,"%d\t %s\t %d\t %d\n", rm.room,rm.type,rm.cap,rm.price);
fclose(k);
}
【问题讨论】:
-
代码是c语言而不是c#。
-
我的坏@jdweng!
-
关于:
struct room { int room; char type[9]; int cap; int price; }rm;这是声明该结构的一个实例,该实例名为:rm。然后在 main() 函数中:struct room rm;正在声明名为rm的结构的另一个实例。强烈建议去掉第一个实例中的rm,所以它只是struct类型的定义,而不是struct的实例 -
OT:将结构中的字段命名为与结构标记名称相同的名称是一种糟糕的编程习惯
-
OT: about:
scanf("%s", rm.type);1) 始终检查返回值,而不是参数值,以确保操作成功。注意:它返回成功输入格式转换的次数。 2) 使用 '%s' 和/或 '%[...]' 输入格式说明符时,始终包含比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符,因为这些说明符总是将 NUL 字节附加到输入。这也避免了缓冲区溢出和由此产生的未定义行为的任何可能性。建议:if( scanf("%8s", rm.type) != 1 ) { // handle error }