繁体   English   中英

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

[英]C++ program does not work on some inputs

你好

我有这个任务只打印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;
}

问题出在这里:

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

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

范围AzAZ + az
Z的ASCII值为90a的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])) 

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

你不需要这一行:

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

你的程序工作正常..

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

isupperislower为true的任何字符的测试,或者是任何字符集特定的字母字符集之一的任何字符,其中iscntrlisdigitispunctisspace都不为真。 在“C”语言环境中, isalpha仅对isupperislower为true的字符返回true。

它们不应被视为大写或小写字符。

另一方面,你的

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

是错误的,因为['A','z']范围通常还包括非字母字符,特别是标准ASCII中的字符[ \\ ] ^ _ `

所以,您应该将支票分为两部分(检查字符是否在[ 'A''Z' ]或[ 'a''z' ]范围内)或者只是使用isalpha并忘记这些内容。

顺便说一句,该标准甚至没有要求[ 'A''Z' ]和[ 'a''z' ]范围必须是连续的(它只保证[ '0'的连续性, '9' ],事实上原始的EBCDIC代码页是一个真正的混乱处理,因为要检查字符是否是字母,你无法检查字符是否在这些范围内。因此,严格来说,你可以甚至没想到

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

将按预期工作。

简而言之:如果它不只是用于家庭作业,请使用isalpha ,它可以保证您的平台使用任何奇怪的代码页。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM