Scanf为两个字符串和一个浮点数

时间:2011-10-12 02:12:28

标签: c scanf

我正在创建一个菜单,需要从用户那里获取三个输入。

    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 *’

我可以解释导致这些问题的原因吗?

2 个答案:

答案 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 );