为什么在这个函数中使用Char数据类型?
我是一名学生,老师给了我这个函数来获取用户输入。它用于整数,但我不明白为什么会有char数据类型。如果有人能解释这个功能,那就太好了为什么在这个函数中使用Char数据类型?,c,scanf,C,Scanf,我是一名学生,老师给了我这个函数来获取用户输入。它用于整数,但我不明白为什么会有char数据类型。如果有人能解释这个功能,那就太好了 #杂注警告(禁用:4996) int getNum(void) { 字符记录[121]={0}; 整数=0; fgets(记录,121,标准DIN); 如果(sscanf(记录、%d、&number)!=1) { 数字=-1; } 返回号码; } 打电话时,我们会这样做,例如: int-age=0//我们总是要初始化 年龄=getNum()//这就是我们调用函数
#杂注警告(禁用:4996)
int getNum(void)
{
字符记录[121]={0};
整数=0;
fgets(记录,121,标准DIN);
如果(sscanf(记录、%d、&number)!=1)
{
数字=-1;
}
返回号码;
}
打电话时,我们会这样做,例如:
int-age=0//我们总是要初始化
年龄=getNum()//这就是我们调用函数获取用户输入的方式
字符记录[121]变量实际上是一个字符数组,也称为字符串。这里使用它是为了,如果给出了错误的输入(而不是有效的整数输入),那么输入流仍然会被fgets()
调用清除,该调用将接收换行符之前(包括换行符)的所有字符
然后,sscanf
函数尝试从读取的字符串中提取一个有效的整数,如果失败,则分配一个错误值(-1
)来表示该事实。如果成功,它将给定的输入值分配给number
,方法与成功调用scanf(“%d”,&number)
相同
但是,仅使用这样一个简单的scanf()
调用可能会在输入流中留下“未处理”字符,这可能会导致任何后续输入操作出现问题(或需要清除输入流)
使用这种技术还可以防止用户在有效输入后键入额外字符所造成的不期望/意外影响。例如,如果您在响应第一个提示时输入
1a
,则以下(故意错误的)代码将导致“意外”:
#包括
int main()
{
int number=0,number2=0;
printf(“输入第一个数字:”);
scanf(“%d”和编号);
printf(“输入第二个数字:”);
scanf(“%d”和编号2);
printf(“给定的数字是:%d和%d.\n”,数字,数字2);
返回0;
}
但是,使用老师提供的getNum()
函数,以下代码更加健壮:
intmain()
{
int number=0,number2=0;
printf(“输入第一个数字:”);
number=getNum();
printf(“输入第二个数字:”);
number2=getNum();
printf(“给定的数字是:%d和%d.\n”,数字,数字2);
返回0;
}
该程序正在使用fgets从文件中读取行,fgets使用字符串作为行的存储缓冲区。之后,它处理该行以查找可以作为int(%d)读取的字符串,检查该操作是否正常,如果正常,则返回整数。函数将输入作为文本读取,并将其存储到字符数组记录中。然后使用sscanf
将该字符串转换为等效整数值
这比直接使用scanf要安全一些-它确保了如果用户键入非数字输入,它仍然会从输入流中消耗,这样以后就不会引起问题。用户在键盘上键入字符。它们需要转换成一个数字,这就是sscanf()的作用。@HansPassant我已经更新了这个问题,以包括如何调用它,我们在使用这个函数时不键入字符,尽管您正在从stdin读取内容。stdin具有多个字符。不管是键盘、文件还是管道……初始化和分配都没有意义。只需编写int age=getNum()代码>-这已经被C允许超过20年了。谢谢你&为了确保我理解。。。如果以字符值的形式输入无效,则此函数是这样编写的?@Joey。是-这种代码的要点是更容易处理无效输入。你有一位好老师:虽然这比使用简单的scanf(“%d”、&number)稍微多一些工作代码>行,您正在学习一种良好的编程技术。