是否可以在C?中处理数据类型不匹配异常?
在C ++和其他高级语言中,代码通常被try ... catch包围。但是,由于C中没有异常处理机制,我们如何处理数据类型不匹配异常?
例如,我们假设我有一个程序要求用户输入一个整数。如果用户错误地击中了字母字符,程序将崩溃。我怎样才能在C中处理这个问题?
以下是一些示例代码:
#include "stdafx.h"
void main()
{
int x = 0;
printf("Hello World!\n\n");
printf("Please enter an integer: ");
scanf("%d", &x);
printf("\n");
printf("The integer entered is %d", x);
printf("\n\n");
printf("Press any key to exit!");
getchar();
getchar();
}
答案 0 :(得分:3)
我将假设您正在使用scanf
来处理输入。程序不应该崩溃。您需要阅读scanf的手册页,并在返回值部分中告诉您该函数返回匹配的项目数。您将此数字与预期数字进行比较。如果它们不同,则采取适当的措施。
修改强>
马修和巴特的一些代码:
int i;
if (scanf("%d", &i) == 1)
{
print("You have entered %d\n", i);
}
else
{
printf("You have entered an invalid number\n");
}
答案 1 :(得分:2)
将代码添加到@EdHeal上面正确说明的内容中。 示例说明代码:
int main(int argc,char ** argv){
int num;
int ret;
printf("Enter a number\n");
ret=scanf("%d",&num);
/* For better clarity From the man page
Upon successful completion, these functions shall return the number of successfully matched and assigned input items; this number can be zero in the event of an early matching failure */
printf("Number of items assigned %d",ret);
printf("The input number is %d",num);
return (EXIT_SUCCESS);
}
因此,为了您的简单,请查看scanf语句的返回值。成功时,即读取整数时,返回1。如果是字符串,则读为0。
示例输出 a)输入一个整数
Enter a number
68
Number of bytes read 1
The input number is 68
RUN SUCCESSFUL (total time: 2s)
b)输入一个字符串
Enter a number
yiy idfd
Number of bytes read 0
The input number is 2665608
RUN SUCCESSFUL (total time: 4s)
答案 2 :(得分:1)
数据输入的几个选项:
您可以使用上面提到的scanf,但我也建议阅读有关getopt,getoptlong的手册页
至于验证,您可以尝试regcomp,regexec,regerror,regfree。例如:
const char* pattern = "^[\\+,-]*[0-9]*$";
regex_t regex;
int reti;
reti = regcomp(®ex, pattern, REG_EXTENDED);
if(reti){
printf("error");
exit(1);
}
reti = regexec(®ex, "34567", 0, NULL, 0);
if(reti == 0) {
printf("String matches pattern.");
}
答案 3 :(得分:-2)
C使用返回值和errno
全局来指示是否有任何错误。因此,在您的情况下,我们假设(因为您没有提供任何代码),您使用strtol
将字符串转换为整数:
char *s = "1234";
int number;
number = strtol(s, NULL, 10);
如果号码设为0
且设置了errno
,则出现问题。
C中的所有功能都以这种方式工作。为了使代码更健壮,请读取字符串而不是数字并进行转换。
事实上,在例外和返回代码上有很多东西。在我看来,异常应该用于特殊的东西。并且不正确的数据输入也不例外(实际上更多的是规则;-)),因此连接转换时不应该抛出任何异常。也许这就是C#也有TryParse
方法的原因。