双字符串和浮点数的Scanf

双字符串和浮点数的Scanf,c,scanf,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",

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

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

我能解释一下导致这些问题的原因吗?

有几个问题:

第一:

当您对字符串使用
scanf
时,您不使用
&
。所以只要
scanf(“%s”,全名)

第二:

您的指针未初始化。请尝试以下方法:

char fullname[256];
char date[256];
只要您最多输入255个字符,此功能就可以正常工作

第三:

您上次键入的
scanf
不匹配。当您在格式字符串中指定了一个
int
时,您正在传递一个
float
。试试这个:

scanf("%f", &sal);

这些警告不言自明。使用
%s
格式说明符调用
scanf
时,需要为其提供指向可复制字符串的字符数组的第一个元素的指针。您没有这样做,而是给它一个指向字符的指针地址

char[100] fullname;
scanf( "%s", fullname );
date也存在同样的问题。另外,请注意,使用上述代码,如果用户输入长度等于或超过100个字符的字符串,则会发生缓冲区溢出

如果您使用的是MSVC,则可以使用
scanf_s
函数,该函数要求您输入缓冲区的长度。但是,此功能是特定于Microsoft的,因此不可移植

scanf_s( "%s", fullname, 100 );
对于salary,问题在于格式说明符是
%d
,用于读取整数,而不是浮点。使用

scanf( "%f", &sal );

这似乎消除了警告,但当您输入代码时,它在meCan上sefaults,您可以跟踪它在哪一行segfults?好的,我认为它segfulted是因为我做错了什么。我想能够输入一个全名“John Doe”,但因为空格太大而无法输入。有没有办法像这样输入一个字符串我不知道有一个C函数可以读取整行代码。看这个问题:()谢谢你的帮助,我走了另一条路