2013-02-13 78 views
2

是否有可能处理C中的数据类型不匹配例外?如何处理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(); 
} 
+1

错误检查?如果你的程序在无效输入时崩溃,你只是不足以验证它。 – Mat 2013-02-13 08:35:58

+0

有人可以举个例子吗?我对C编程语言很陌生。 – Matthew 2013-02-13 08:36:43

+1

这根本不是C特有的。有可能约。一个四分之一英镑的例子来检查网络上可用函数的返回值。 – Mat 2013-02-13 08:41:27

回答

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"); 
} 
-2

C使用返回值和errno全球,表示如果出现了错误与否。所以,你的情况,我们假设(因为你没有提供任何代码),你正在使用strtol翻译字符串转换成整数:

char *s = "1234"; 
int number; 
number = strtol(s, NULL, 10); 

如果数量为0errno设置,出事了。

C中的所有函数都以这种方式工作。为了使您的代码更健壮,请读取字符串而不是数字并将其转换。

事实上,在异常和返回代码上有很多可以找到的东西。在我看来,异常应该用于例外情况。而不正确的数据输入并不例外(实际上这更多的是一个规则;-)),因此连接转换时不应该抛出异常。也许这就是C#也有一个TryParse方法的原因。

+0

所以0不再是一个整数?! – 2013-02-13 08:53:26

+0

-1不是我的,但'atoi'真的是一个不好的例子 – 2013-02-13 08:53:30

+0

@JensGustedt会'strtol'会好些吗?重点是使用返回码而不是例外。 – 2013-02-13 08:54:19

2

将代码添加到@EdHeal上面正确说的内容中。 示例代码示例:

INT主(INT ARGC,字符**的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); 

}

所以在这里为您simplicty看到的scanf statment的返回值。一旦成功,即读取整数时,它返回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) 
+0

这行不正确'printf(“读取的字节数%d”,ret);'它是格式化字符串中的项目数,如输出结果所示。 – 2013-02-13 08:59:22

+0

@EdHeal Yup!匆忙写道。感谢您指出。 ! – rockstar 2013-02-13 09:07:18

1

用于数据输入的几个选项:

可以使用的scanf如上面提到的,但我也推荐阅读关于getopt的手册页,getoptlong

至于验证你可以尝试regcomp,regexec,regerror,regfree。例如:

const char* pattern = "^[\\+,-]*[0-9]*$"; 
    regex_t regex; 
    int reti; 
    reti = regcomp(&regex, pattern, REG_EXTENDED); 
    if(reti){ 
    printf("error"); 
    exit(1); 
    } 
    reti = regexec(&regex, "34567", 0, NULL, 0); 
    if(reti == 0) { 
    printf("String matches pattern."); 
    }