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

C++ how to cout once instead of multiple times in a for loop

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)?像 "English Alphabet" 而不是 "abcd" 的 4 次。

示例:

gimme a string:
abcd
English Alphabet
English Alphabet
English Alphabet
English Alphabet

gimme a string:
abc!
English Alphabet
English Alphabet
English Alphabet
NOT English Alphabet

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

这里有两种解决方案:

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

没有 bool 并且 int 作为 return 值:

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

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

我不确定我是否得到了你想要的,我也不懂 C++,但可以帮助你的是使用布尔值来定义输入中是否包含非英文字符。你会从一开始就把它定义为真,一旦你发现一个字符不是英文字符,你就把它设置为假。当您跳出 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;
    }
}

如果您输入 space 程序应该 运行 OK,但它总是 return "not english alphabet"。这是因为如果输入的当前字符位于 ASCII 字符 space 的字符 A 和 z 之间,则您正在进行的测试会考虑在内。见下图:



看看space是第32个字符,比'A'小,所以不会进入你的if块,落入else里面,所以returning 'NOT English alphabet'。数字、@ 符号、& 符号以及 'A' 之前的所有内容以及 'z' 之后的所有内容也将无法通过测试。此外,方括号(“[”和“]”)将作为英文字母输入传递。

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

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

如果要包含[=36​​=]s,再添加一个&&:

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

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

祝你好运!

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

首先,我会查找 std::isalpha。专门定义一个字符是否为字母1.

其次,我会查找 std::all_ofstd::any_of。它们的定义是为了确定集合的 any/all 是否符合特定要求。

把它们放在一起,你可以做这样的事情:

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";对于诸如确定某物是否是字母之类的事情,它遵循英文字母表。

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

这是一次执行一行代码的非常简单和合乎逻辑的方法:

int x=1
if (x==1)
{
   //your cout-code here;
   x++; 
}  

x变成2,下次就不会执行了