C ++程序不适用于某些输入

时间:2010-10-10 13:36:29

标签: c++ string

我有这个任务只打印C ++字符串中的字母。它适用于大多数输入,但当输入中存在[]时,它们也会被打印出来。

#include <iostream>
#include <string>

using namespace std;

int main()
{
        string input = "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG]";

        for(int i=0;i<input.size();i++) 
        {
                if(input[i] >='A' && input[i] <= 'z')
                //if(isalpha(input[i]))
                        cout<<input[i];
        }
        cout<<endl;
        return 0;
}

5 个答案:

答案 0 :(得分:7)

问题在于:

if(input[i] >='A' && input[i] <= 'z')
              ^^^                ^^^ 

您使用的是大写'A'和小写'z'

范围A-zA-Z + a-z不同 Z的ASCII值为90,而a的ASCII值为97

他们之间还有其他6个字符正在考虑作为字母表。

ASCII value   Character
------------------------
90            Z 
91            [ \ 
92            \  \
93            ]   \  your range A-z includes these.
94            ^   /
95            _  /
96            ` /
97            a

要仅允许使用大写和小写字母:

if( (input[i] >='A' && input[i] <= 'Z') || (input[i] >='a' && input[i] <= 'z') )

甚至更好地使用isalpa

if(isalpha(input[i])) 

答案 1 :(得分:2)

这是因为A-z范围内有一些特殊字符。 如果要过滤掉[和]等特殊字符,则需要单独使用A-Z范围,然后单独使用a-z范围

答案 2 :(得分:1)

您不需要这一行:

if(input[i] >='A' && input[i] <= 'z')

你的程序工作正常......

答案 3 :(得分:1)

isalpha应该在方括号上返回0,因为它是由标准(C ++03§7.4.1.2.2)定义的

  

测试isupperislower为真的任何字符,或任何字符集特定的字母字符集之一,iscntrl,{{ 1}},isdigitispunct为真。在“C”语言环境中,isspace仅对isalphaisupper为真的字符返回true。

并且不应将它们视为大写或小写字符。

另一方面,你的

islower

错误,因为['A','z']范围通常还包括非字母字符,特别是标准ASCII中的字符if(input[i] >='A' && input[i] <= 'z')

因此,您应该将支票拆分为两部分(以检查字符是否在[[ \ ] ^ _ `'A']或['Z''a']范围内)或者只是使用'z'并忘掉这些东西。

顺便说一下,该标准甚至没有规定[isalpha'A']和['Z''a']范围必须是连续的(仅限于此保证了['z''0']的连续性,事实上原始的EBCDIC代码页是一个真正的混乱处理,因为要检查一个字符是否是按字母顺序排列的,你无法检查因此,要严格遵守标准,你甚至不能指望

'9'

将按预期工作。

长话短说:如果不仅仅是作业,请使用if((input[i] >='A' && input[i] <= 'Z') || (input[i] >='a' && input[i] <= 'z')) ,这可以保证您的平台使用任何奇怪的代码页。

答案 4 :(得分:0)

或,#include<cctype>并使用std::isalpha(input[i])