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