2014-11-21 109 views
1

我想检查一个字符串是否包含除0-9或A-Z以外的任何字符,如果是,请停止程序。这是我所做的:扫描字符串的ASCII值

string number_in; 

for (int i = 0; number_in[i] == '\0'; i++) 
{ 
    if ((number_in[i] < 48) || ((number_in[i] > 57) && (number_in[i] < 65)) || (number_in[i] > 90)) 
    { 
     cout << "\nInput number contains incorrect characters!\n"; 
     getchar; 
     return 0; 
    } 
} 

但无论我输入哪个字符串,它总是跳过for循环。为什么?

+1

更改您的号码:'(number_in [i] <'0')。改用字符常量。请相信编译器将它们转换为正确的ASCII数值。 – 2014-11-21 20:52:25

+0

您需要将输入数据更改为所有'\ 0',因此*循环会继续*,因为您告诉编译器在* number [i]等于'\ 0'时使循环*继续。 – 2014-11-21 20:54:28

回答

1

number_in[i] == '\0'应该是number_in[i] != '\0'。 for循环在条件为真时运行。

3

number_in[i] == '\0'似乎是不正确的。这是继续运行的循环条件。

但是,使用std::isalnumstd::all_of一个简单的解决方案:

bool stopProgramm = !std::all_of(std::begin(str), std::end(str), 
            [] (unsigned char c) 
            { return std::isdigit(c) || std::isupper(c); }); 
+0

这比其他神秘的ASCII代码更具可读性。 48是不是很明显,如果这是错误的并不明显。 – tadman 2014-11-21 20:50:01

+0

该OP专门称为A-Z,即仅大写。 – 2014-11-21 22:25:20

+0

@ PaulJ.Lucas那么,有一个简单的修复。虽然不是很性感。 – Columbo 2014-11-21 22:30:33

0

你应该这样做:

#include <cctype> 

// ... 

    char const c = number_in[i]; 
    if (!(isascii(c) && (isdigit(c) || isupper(c)))) { 
    // ... 
    } 

严格地说,不需要isascii(c),但是,如果你想成为跨平台,如果c不是ASCII,则其他is*()函数在Windows上中断。