如何处理C中的数据类型不匹配异常

时间:2013-02-13 08:34:00

标签: c exception types mismatch

是否可以在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();
}

4 个答案:

答案 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(&regex, pattern, REG_EXTENDED);
   if(reti){
   printf("error");
   exit(1);
   }
   reti = regexec(&regex, "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方法的原因。