C ++如何在for循环中cout一次而不是多次

时间:2017-10-06 20:59:08

标签: c++ arrays void

void f3(string x){
    for (int i=0; i < x.length(); i++){

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

            cout << "English Alphabet" << endl;
        }
        else {
            cout << "NOT English Alphabet" << endl;
            break;
        }
    }
}

如何只得到一个结果(cout)?比如“英文字母”而不是“abcd”的4倍。

的示例:

  

给我一​​个字符串:
  ABCD
  英文字母

  英文字母

  英语   字母
  英文字母

  

给我一​​个字符串:
  ABC!
  英文字母

  英文字母

  英语   字母
  不是英文字母

如果我输入空格,程序就不起作用了。 我该怎么办呢? 谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

我不确定我是否得到了你想要的东西,而且我不知道C ++,但可以帮助你的东西是使用布尔值来定义输入中是否包含非英文字符。您可以从头开始将其定义为true,并且一旦找到不是英文字符的字符,就将其设置为false。当您退出for循环时,使用if检查输入是否只有英文字符。它会是这样的:

void f3(string x) {
    bool isEnglish = true;

    for (int i=0; i < x.length(); i++){

        if ('A'>x[i] || 'z'<x[i]){
            isEnglish = false;
            break;
        }
    }

    if (isEnglish) {
        cout << "English Alphabet" << endl;
    } else {
        cout << "NOT English Alphabet" << endl;
    }
}

如果输入空格,程序应该运行正常,但它总是返回“非英文字母”。这是因为如果输入的当前字符在ASCII字符空间的字符A和z之间,则您正在进行的测试会考虑到这一点。见下图:

enter image description here

查看空格是如何字符编号32,小于'A',因此,不会进入你的if块,并且落入其他内部,因此返回'NOT English alphabet'。数字,@符号,&amp;标志和'A'之前的所有内容以及'z'之后的所有内容也将无法通过测试。此外,括号('['和']')将作为英文字母输入传递。

如果您只想包含字母,则if应如下所示:

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

如果您想要包含空格,请添加另一个&amp;&amp ;:

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

可以使用相同的逻辑在验证中添加任何字符。

祝你好运!

答案 1 :(得分:1)

由于您已将其标记为C ++,我将假设您更喜欢使用真正的C ++编写的解决方案。

首先,我会查找std::isalpha。它专门用于确定字符是否为字母 1

其次,我会查找std::all_ofstd::any_of。它们被定义为确定任何/所有集合是否符合特定要求。

把这些放在一起,你可以这样做:

if (!std::all_of(x.begin(), x.end(), 
                 [](unsigned char c) { return std::isalpha(c); })
    std::cout << "Not ";

std::cout << "English alphabet\n";

1.请注意isalpha的结果不一定基于英文字母。相反,它基于当前的语言环境,因此(例如)法语语言环境,它会说不仅是“a”字母,而且“â”和“à”也是字母(也就是你的字母)同样,对于德语语言环境,它会说“ß”是字母(依此类推)。默认语言环境名为“C”;对于确定某些内容是否为字母的内容,它遵循英语字母表。 功能

答案 2 :(得分:0)

这里有两个解决方案:

使用bool变量:

void f3(string x)
{
    bool notEnglish = false;

    for (int i=0; i < x.length(); i++)
    {
        if ( ('A' > x[i] || 'z' < x[i]) && x[i] != ' ' )
        {
            notEnglish = true;
            break;
        }
    }

    if (notEnglish) std::cout << "NOT ENGLISH" << std::endl;
    else std::cout << "ENGLISH" << std::endl;
}

没有boolint作为返回值:

int f3(string x)
{
    for (int i=0; i < x.length(); i++)
    {
        if ( ('A' > x[i] || 'z' < x[i]) && x[i] != ' ' )
        {
            std::cout << "NOT ENGLISH" << std::endl;
            return -1;
        }
    }

    std::cout << "ENGLISH" << std::endl;
    return 1;
}

我更喜欢第二个,因为你有一个函数内发生的反馈(返回值)。

答案 3 :(得分:0)

您可以声明一个本地布尔变量,这样一旦非英语检测到循环中断,立即将该变量设置为false。

事情比较棘手:检查非英文字符:

void f3(string x){
    bool IsEng = true;
    for(int i = 0; i < x.length(); i++){
        if ( !( x[i] >= 'A' && x[i] <= 'z') ){
            IsEng = false;
            break;
        }
    }

    if(IsEng)
        cout << "English Alphabet" << endl;
    else
        cout << "Not English Alphabet" << endl;
}