2

是否可以在 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

4 回答 4

4

我将假设您正在使用scanf来处理输入。程序不应该崩溃。您需要阅读scanf的手册页,并在返回值部分告诉您该函数返回匹配的项目数。您将此数字与预期的数字进行比较。如果它们不同,则采取适当的措施。

编辑

Matthew 和 Bart 的一些代码:

int i;

if (scanf("%d", &i) == 1)
{
    printf("You have entered %d\n", i);
}
else
{
    printf("You have entered an invalid number\n");
}
于 2013-02-13T08:37:39.890 回答
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)
于 2013-02-13T08:55:40.100 回答
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.");
   }
于 2013-02-13T08:58:29.683 回答
-2

C 使用返回值和errno全局来指示是否出现任何问题。因此,在您的情况下,让我们假设(因为您没有提供任何代码),您正在使用strtol将字符串转换为整数:

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

如果 number is0并且errno已设置,则出现问题。

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

事实上,有很多关于异常和返回码的内容。在我看来,异常应该用于异常的东西。并且错误的数据输入并不例外(实际上它更像是一个规则;-)),因此在连接转换时应该不会抛出异常。也许这就是 C# 也有TryParse方法的原因。

于 2013-02-13T08:50:27.493 回答