C项目scanf()

C项目scanf(),c,scanf,C,Scanf,这是我的代码,我的声明是当while循环开始运行时,在第一次迭代中显示选项并扫描选择,但在第二次迭代中,选择不会再次分配,并且会记住以前的选择。有什么问题?(我正在使用VS2012) 可能发生的情况是,当您第二次调用scanf时,出现了一个错误。可能是因为一个非数字输入正在等待在stdin上读取。也许您上次在代码主体中没有完全阅读所有输入?由于您的转换格式%d,scanf尝试读取一个数字,但仅读取一个数字。因此,如果下一个要读取的内容不是数字,它将失败,并返回一个错误,并保留选项不变。您不会检查

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


可能发生的情况是,当您第二次调用scanf时,出现了一个错误。可能是因为一个非数字输入正在等待在stdin上读取。也许您上次在代码主体中没有完全阅读所有输入?由于您的转换格式
%d
,scanf尝试读取一个数字,但仅读取一个数字。因此,如果下一个要读取的内容不是数字,它将失败,并返回一个错误,并保留
选项
不变。您不会检查此错误,因此假设choice包含新输入的值,而实际上它只包含在调用scanf之前包含的内容。scanf也可能会因为更多类似错误的原因而失败,但我怀疑这里的情况并非如此

我的建议是:

a) 检查scanf的返回值。在您的情况下,它应该返回1。如果没有,则出现了错误。你可以退出,也可以只是再次出示菜单

b) 请查看fpurse/fflush。我不确定使用VC++你会得到什么,但谷歌会为你找到等价物。这些函数可用于在调用scanf之前丢弃挂起的输入


HTH

实际上,您的代码的行为符合预期

可通过以下输入再现该行为

FirstName: f
LastName: l
ID: 1
Gpa: 2
Department: d
Department
需要一个
int
作为输入,当您键入其他内容时,
d
在这种情况下,当您循环时,系统会一直查找
int
,因此行
scanf(“%d”,&choice)
读取
int
时也失败,并且
choice
没有重新分配新值,因此
switch
语句总是看到
choice
的最后一个有效值。循环在下一次读取尝试时暂停

要解决您的问题,您需要验证输入,并且仅当您期望的输入有效时才转到下一步。您可以通过检查witch的返回值来实现这一点,witch是根据转换模式成功解析的项目数,在您的情况下,您希望只读
一个
项目

下面是验证整数输入的基本方法

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;
}
下面是您如何阅读
部门

int department = read_integer("Department");

您还可以为
float
->
float read_float(char*){…}

编写类似的函数。您确实应该验证scanf调用的返回值(以及实际上在
中声明的大多数函数),例如
if(scanf(“%d”,&choice)!=1)/*error*我无法重现您描述的行为。你能想出一个SSCCE()吗?行为如预期!显示
AddStudent
做了什么,以及
s
在何处/如何声明为“问题是什么?”最直接的问题是未能使用调试器。一旦解决了其他“问题”,你会惊奇地发现它们解决得如此之快。考虑到您使用的是Visual Studio,它可以说是市场上最好的集成调试器,没有什么理由不解决它。
int department = read_integer("Department");