C ++项目scanf()的(C Project scanf())

2019-09-29 13:07发布

这里是我的代码,我的语句是while循环开始运行显示选项,并在第一次迭代但在第二次迭代选择扫描选择时不会被再次分配和以前的选择被记住。 问题是什么 ? (我使用VS2012)

while (!done){
    int choice;

    printf("\n------- STUDENT INFORMATION SYSTEM MAIN MENU --------\n");
    printf("1-Load students from the database\n");
    printf("2-Print existing students on the screen\n");
    printf("3-Add a new student\n");
    printf("4-Delete an existing student\n");
    printf("5-Find an existing student\n");
    printf("6-Quit\n");
    printf("====> Choice? ");
    scanf("%d", &choice);

    switch(choice){
      case 1:
        LoadStudentsFromDatabase();
        printf("Students loaded from database successfully\n");
        break;

      case 2:
        PrintExistingStudentsOnTheScreen();
        break;

      case 3:
        printf("\nFirstName: "); scanf("%s", s.firstName);

    printf("LastName: "); scanf("%s", s.lastName);
        printf("ID: "); scanf("%d", &s.id);
        printf("Gpa: "); scanf("%f", &s.gpa);
        printf("Department: "); scanf("%d", &s.department);

        AddStudent(&s);
        printf("1 student added\n");
        break;

      case 4:
        printf("\nID? "); scanf("%d", &id);
        if (DeleteStudent(id)){
          printf("Student deleted successfully\n");
        } else {
          printf("Failed to delete the student. Does not exist?\n");
        } /* end-else */
        break;

      case 5:
        printf("\nID? "); scanf("%d", &id);
        ps = FindStudent(id);
        if (ps == NULL){
          printf("Student not found\n");
        } else {
          char *depts[] = {"CS", "EE", "IE", "CE", "ME"};
          printf("+--------------------+--------------------+------+------+------+\n");
          printf("|    FirstName       |     LastName       |  ID  |  GPA | Dept |\n");
          printf("+--------------------+--------------------+------+------+------+\n");
          printf("|%20s|%20s|%6d|%6.2f|%6s|\n", ps->firstName, ps->lastName, ps->id, ps->gpa, depts[ps->department]);
          printf("+--------------------+--------------------+------+------+------+\n");
        } //end-else
        break;

      case 6:
        done = 1;
        break;

      default:
        printf("!!!!!!!!!! Invalid choice. Try again :-))\n");
        break;
    } /* end-switch */
  } /* end-while */

Answer 1:

什么是可能发生的事情是,当你调用scanf函数的第二次,有一个错误。 可能是因为非输入数字正在等待标准输入读取。 也许你并没有完全代码上次周围的人的身体中读取所有的输入? scanf函数试图读取一个数字,只有一个数字,因为您的转换格式%d ,所以如果要读取的下一件事是不是很失败,返回一个错误,留下一个数字choice不变。 你没有检查这个错误如此假设选择包含新输入的值,而实际上只包含不管它包含scanf函数被调用之前。 scanf函数也可以失败更像是错误的原因,以及,但我在这里怀疑那不是如此。

我的建议是:

a)检查scanf函数的返回值。 它应该在你的情况下返回1。 如果不是出现了一个错误。 你可以摆脱困境,或只是再次出现菜单。

B)看一看fpurge / fflush。 我不知道将提供您在使用VC什么++但谷歌会找到你的等价物。 这些功能可以用于调用scanf的前丢弃挂起的输入。

HTH



Answer 2:

其实你的代码是表现如预期。

该行为可以用下面的输入转载

FirstName: f
LastName: l
ID: 1
Gpa: 2
Department: d

Department预计的int当你在别的东西,类型作为输入, d在这种情况下, scanf函数不断寻找一个int因为你是循环的,所以行scanf("%d", &choice); 失败太阅读的intchoice不重新分配一个新的值,因此switch语句总是看到最后一个有效的价值choice 。 循环在下一读取尝试然后暂停。

为了解决你的问题,你需要验证输入并转到只有当你期望的输入是有效的下一个步骤。 您可以通过检查返回值做到这一点的scanf女巫是根据转换图案成功解析项目的数量,你的情况,你想读的只有one项目。

下面是一个基本方式,你如何能验证一个整数输入

int read_integer(char* what)
{
    int i = 0;
    printf("%s: ", what);
    int r = scanf("%d", &i);
    while(r == 0) {
        while('\n' != getchar())
            // consume the rest of input until a LF comes (enter pressed)
            ;
        printf("Bad input for %s, try again (r=%d)\n", what, r);
        printf("%s: ", what);
        r = scanf("%d", &i);
    }
    return i;
}

这里怎么会读Department

int department = read_integer("Department");

你也可以写一个类似的功能float - > float read_float(char*){...}



文章来源: C Project scanf()
标签: c scanf