scanf()第二次进入字符串

时间:2015-06-04 10:04:13

标签: c scanf

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

我无法输入第二个员工姓名。有谁能帮我解决这个问题?

2 个答案:

答案 0 :(得分:1)

fflush(stdin);
标准C中

未定义的行为。要刷新换行符,只需使用getchar()即可。

printf("\nEnter staff name \t> ");
getchar();
scanf("%[^\n]s", staff_name2);

我还会使用fgets()而不是scanf来读取一行并在必要时修剪换行符,这样可以更好地控制用户输入的无效输入和缓冲区溢出。

答案 1 :(得分:0)

你有三个问题。

  1. 我看到您使用%[^\n]s。这是错误的。 s不是%[说明符的一部分。因此,请使用%[^\n]代替%[^\n]s
  2. 输入sales1的值后,按 Enter 。此字符保留在stdin(标准输入流)中。当%[^\n]的下一个字符为\n时,它将失败。通过在%[^\n]之前添加空格来解决此问题。
  3. fflush上使用stdin按照C11标准调用未定义的行为,尽管在某些实现中行为已明确定义。最好将其删除,以便您的代码更具可移植性。
  4. 附加说明:

    • 您可以限制要扫描的字符数量,以便您可以避免buffer overflows
    • 您可以检查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);
    
    
    }