我正在创建一个菜单,需要从用户那里获取三个输入。
char *fullname;
char *date;
float sal;
printf("\nEnter full name: ");
第92行
scanf("%s", &fullname);
printf("\nEnter hire date: ");
第94行
scanf("%s", &date);
printf("\nEnter salary: ");
第96行
scanf("%d", &sal);
这些是我收到的错误
Employee.c:92: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
Employee.c:94: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
Employee.c:96: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
我可以解释导致这些问题的原因吗?
答案 0 :(得分:1)
有几个问题:
首先:
当您对字符串使用scanf
时,请不要使用&
。所以只需scanf("%s", fullname);
。
第二
您的指针未初始化。试试这个:
char fullname[256];
char date[256];
只要您输入最多255个字符,这将有效。
第三
您上次scanf
的输入不匹配。当您在格式字符串中指定float
时,您将传入int
。试试这个:
scanf("%f", &sal);
答案 1 :(得分:0)
警告非常明显。当您使用scanf
格式说明符调用%s
时,需要为其提供指向字符串可以复制到的char数组的第一个元素的指针。你没有这样做,而是给它一个指向char的指针的地址。
char[100] fullname;
scanf( "%s", fullname );
日期存在同样的问题。另外,请注意使用上面的代码,如果用户输入长度等于或大于100个字符的字符串,则会发生缓冲区溢出。
如果您正在使用MSVC,则可以使用scanf_s
功能,而不是要求您输入缓冲区的长度。但是,此功能是Microsoft特定的,因此是不可移植的。
scanf_s( "%s", fullname, 100 );
对于薪水,问题是格式说明符是%d
,用于读取整数而不是浮点数。使用
scanf( "%f", &sal );