scanf无法在C中的字符串后读取浮点数据?

Abd*_*sud -1 c

我正在尝试解析输入,例如,101-John-3.4但按最后顺序未读取float数据3.4。我怎么解决这个问题?

for (i = 0; i < n; ++i) {
    printf("Enter ID-Name-CGPA respectively: ");
    scanf("%lld-%[^-]s-%f", id[i], name[i], cgpa[i]);
}
Run Code Online (Sandbox Code Playgroud)

ex *_*ilo 5

您需要s从scanset伪指令中删除格式字符串中的结尾:

scanf("%lld-%[^-]-%f", id[i], name[i], cgpa[i]);
Run Code Online (Sandbox Code Playgroud)

s不是scanset指令的一部分,因此scanf()尝试并且失败以匹配s输入中的也是如此。如果代码正在检查从调用到的返回值,则可以检测到这一点scanf(),这始终是一个好习惯。

另外,没有显示任何声明,但是如果id[]声明为long long ints 的数组,并且cgpa[]声明为floats 的数组,则应使用地址运算符。另外,为了防止缓冲区溢出,您应该始终指定%sor %[]指令要读取的最大字符数。输入太大会导致程序尝试在数组末尾进行写操作name[],从而导致未定义的行为。例如,如果name是30 chars 的数组,即char name[30];,则需要%29[^-]-。您需要指定29而不是30,因为此数字scanf()表明要读取的最大字符数;在%s%[]指令总是至少写一个字,一个\0 创建一个字符串,因此指定最多读取29个字符可确保最多写入30个字符:

int ret_val = scanf("%lld-%29[^-]-%f", &id[i], name[i], &cgpa[i]);
/* ret_val should be 3 */
Run Code Online (Sandbox Code Playgroud)