2011-10-11 35 views
0

我已经写了小C++控制台应用程序,这是源代码:整数验证在C++

#include<stdio.h> 
#include<locale.h> 
#include<ctype.h> 
#include<stdlib.h> 

void main() 
{ 
    setlocale(LC_ALL, "turkish"); 
    int a,b,c,d; 

    printf("first number: "); 
    scanf("%d", &a); 

    printf("second number: "); 
    scanf("%d", &b); 

    c = a+b; 

    printf("Sum: : %d\n", c); 
} 

正如你可以看到我正在请求来自用户的两个数字,不是对它们求和。但是我想添加一个控件,其中检查用户输入的数字是整数吗?

我会检查用户输入的数字,如果数字不是一个整数,我会回显一个错误。我在每scanf之后使用此功能,但效果不佳。

if(!isdigit(a)) 
{ 
      printf("Invalid Char !"); 
      exit(1); 
} 

简而言之,在scanf操作上,如果用户键入“a”,它将产生一个错误消息并且程序停止工作。如果用户输入一个号码程序将继续

+1

我重新标记此为C,因为我什么也没看到C++它,它会帮助你更好的答案。 –

+0

自10分钟前我在学习C++,哈哈!我们的教授这样写道。我复制它。 – Eray

+2

@Eray它不是'无效主',它从来没有,也永远不会。它是'int main',尽管'return'语句在'main'中是可选的(但是这是唯一的非''void'函数,它们是可选的)。 –

回答

7

scanf为您做了验证。只需检查scanf的返回值即可。

printf("first number: "); 
if(scanf("%d", &a) != 1) { 
    printf("Bad input\n"); 
    return 1; 
} 

printf("second number: "); 
if(scanf("%d", &b) != 1) { 
    printf("Bad input\n"); 
    return 1; 
} 
+0

但我无法自定义错误。 – Eray

+1

我不知道你的意思是“我无法自定义错误。”当scanf失败时,你当然可以打印你想要的任何错误信息,对吗? –

+0

是的我的意思是*错误信息*对于错字抱歉。现在你的回答非常好,真的帮了我很大的忙。谢谢 ! – Eray

1

isdigitchar作为参数。

如果呼叫scanf成功,则保证您有一个整数。

scanf也有一个返回值,表示它读取了多少个值。

您想检查scanf的返回值是否为1。

参见:http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

+0

但是,例如,我为第一个数字输入了“A”,并且它正在跳过第二个数字,而不是直接写入,SUM:-1717986920' – Eray

+2

这是因为第一个'scanf'尝试读取“A”并失败,返回0.由于缓冲区中仍有输入,下一个'scanf'立即尝试做同样的事情,失败并返回'0'。尝试Rob的答案 - 我认为你会明白当你做什么时会发生什么。 –

2

C++的方式做,这将是

#include <iostream> 
#include <locale> 

int main() 
{ 
    std::locale::global(std::locale("nl_NL.utf8")); // tr_TR doesn't exist on my system 

    std::cout << "first number: "; 

    int a; 
    if (!(std::cin >> a)) 
    { 
     std::cerr << "whoops" << std::endl; 
     return 255; 
    } 

    std::cout << "second number: "; 

    int b; 
    if (!(std::cin >> b)) 
    { 
     std::cerr << "whoops" << std::endl; 
     return 255; 
    } 

    int c = a+b; 

    std::cout << "Sum: " << c << std::endl; 

    return 0; 
} 
+0

你一定是在开玩笑:S我听到这些第一次('std :: locale :: global(),cin,cout等......) – Eray

+0

scanf,printf,setlocale在ANSI C领域都是稳固的: ) – sehe

+0

我不知道它是什么:)我正在从事网络开发(PHP)4年,但我从未与C,C++合作过 – Eray