scanf()第二次进入字符串有什么问题,我不能第二次输入我的字符串。 我不确定发生的错误,我不能很好地使这个程序功能
#include <stdio.h>
#include <stdlib.h>
int main()
{
//variables decleration
char staff_name1[31];
char staff_name2[31];
float sales1, sales2;
//input
printf("Enter staff name\t> ");
scanf("%[^\n]s", staff_name1);
printf("Enter sales amount\t> ");
scanf("%f", &sales1);
printf("\nEnter staff name \t> ");//ERROR,CAN'T INPUT MY STRING
fflush(stdin);
scanf("%[^\n]s", staff_name2);
printf("\nEnter sales amount\t> ");
scanf("%f", &sales2);
printf("\n");
//output
printf("Staff Name\t\t\t\tSales Amount\n");
printf("===================\t\t=============\n");
printf("%-20s \t%12.2f\n", staff_name1, sales1);
printf("%-20s \t%12.2f\n", staff_name2, sales2);
}
我的输出代码如下:
warning: this program uses gets(), which is unsafe.
Enter staff name > kh s
Enter sales amount > 134.14
Enter staff name >
Enter sales amount > 141243.14
Staff Name Sales Amount
=================== =============
kh s 134.14
141243.14
我无法输入第二个员工姓名。有谁能帮我解决这个问题?
答案 0 :(得分:1)
fflush(stdin);
标准C中是未定义的行为。要刷新换行符,只需使用getchar()
即可。
printf("\nEnter staff name \t> ");
getchar();
scanf("%[^\n]s", staff_name2);
我还会使用fgets()
而不是scanf来读取一行并在必要时修剪换行符,这样可以更好地控制用户输入的无效输入和缓冲区溢出。
答案 1 :(得分:0)
你有三个问题。
%[^\n]s
。这是错误的。 s
不是%[
说明符的一部分。因此,请使用%[^\n]
代替%[^\n]s
sales1
的值后,按 Enter 。此字符保留在stdin
(标准输入流)中。当%[^\n]
的下一个字符为\n
时,它将失败。通过在%[^\n]
之前添加空格来解决此问题。fflush
上使用stdin
按照C11标准调用未定义的行为,尽管在某些实现中行为已明确定义。最好将其删除,以便您的代码更具可移植性。附加说明:
scanf
的返回值以确保其成功。程序中的所有scanf
都会在成功时返回1. <小时/> 修正程序:
#include <stdio.h>
#include <stdlib.h> //Unused header
int main()
{
char staff_name1[31];
char staff_name2[31];
float sales1, sales2;
printf("Enter staff name\t> ");
if(scanf(" %30[^\n]", staff_name1) != 1)
{
printf("Could not scan staff_name1");
return -1; //Exit main with a return value of -1
}
printf("Enter sales amount\t> ");
if(scanf("%f", &sales1) != 1)
{
printf("Could not scan sales1");
return -1; //Exit main with a return value of -1
}
printf("\nEnter staff name \t> ");
//fflush(stdin); UB!
if(scanf(" %30[^\n]", staff_name2) != 1)
{
printf("Could not scan staff_name2");
return -1; //Exit main with a return value of -1
}
printf("\nEnter sales amount\t> ");
if(scanf("%f", &sales2) != 1)
{
printf("Could not scan sales2");
return -1; //Exit main with a return value of -1
}
printf("\n");
//output
printf("Staff Name\t\t\t\tSales Amount\n");
printf("===================\t\t=============\n");
printf("%-20s \t%12.2f\n", staff_name1, sales1);
printf("%-20s \t%12.2f\n", staff_name2, sales2);
}