【问题标题】:C++ how to cout once instead of multiple times in a for loopC ++如何在for循环中计算一次而不是多次
【发布时间】:2017-10-06 20:59:07
【问题描述】:
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!
英文字母
英文字母
英语 字母
不是英文字母

如果我输入空格,程序将无法运行。 我该如何解决? 感谢您的帮助!

【问题讨论】:

  • 你试过用调试器单步调试代码吗^
  • 取决于您的需要。您可以使用 bool 标志来标记您是否遇到了一些 非英文字母 字符,并且根据其状态,您可以打印 "English Alphabet"“非英文字母”
  • 如果算法库不被允许,将循环移到它自己的函数中,一旦发现非英文就返回false。如果您到达循环的末尾,则返回 true。
  • @Borgleader 这有多酷? &lt;algorithm&gt; 满满当当。

标签: c++ arrays void


【解决方案1】:

我不确定我是否得到了您想要的东西,而且我不知道 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 之间。见下图:



看看 32 号字符的空格如何,它小于“A”,因此不会进入您的 if 块,并落在 else 中,从而返回“NOT English alphabet”。数字、@ 符号、& 符号以及“A”之前的所有内容以及“z”之后的所有内容也将无法通过测试。此外,括号('[' 和 ']')将作为英文字母输入传递。

如果你只想包含字母,你的 if 应该是这样的:

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

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

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

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

祝你好运!

【讨论】:

  • 对不起,我放错了变量的声明。我现在修好了。
【解决方案2】:

由于您已将其标记为 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”字母,而且“â”和“à”也是字母(你的test 不会)。同样,对于德语语言环境,它会说“ß”是字母(等等)。默认语言环境被命名为“C”;对于确定某物是否是字母的事情,它遵循英文字母。

【讨论】:

  • 感谢您的帖子!它帮助我理解了一些有趣的新功能。
【解决方案3】:

这里有两种解决方案:

使用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;
}

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

【讨论】:

  • 谢谢!我真的很想使用 bool 但我不知道如何集成到代码中!我真的很感激。
【解决方案4】:

您可以声明一个本地布尔变量,以便在非英语检测到循环中断后立即将变量设置为 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2016-11-09
    相关资源
    最近更新 更多