C++ For循环的效率和可读性,比较两个C风格的字符串

Log*_*ing 2 c++ for-loop c-strings

所以我创建了自己的函数来比较两个C字符串:

bool list::compareString(const char array1[], const char array2[])
{
    unsigned char count;
    for (count = 0; array1[count] != '\0' && array2[count] != '\0' && (array1[count] == array2[count] || array1[count + 32] == array2[count] || array1[count] == array2[count+32]); count++);
    if (array1[count] == '\0' && array2[count] == '\0')
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

我的for循环的参数非常长,因为它将计数带到至少一个字符串的末尾,并char以这样的方式比较每个数组中的每个字符串它们的情况无关紧要(将32添加到大写字母char转为char进入小写的对应部分).

现在,我猜这是比较两个C字符串的最有效方法,但由于它的长度,for循环难以阅读.我被告知的是尽可能使用for循环而不是while循环,因为for循环在其起始参数中具有起始,结束和递增条件,但为此,这似乎可能不适用.

我要问的是,我应该如何格式化这个循环,是否有更有效的方法呢?

ron*_*chn 5

count您可以直接在指针上操作,而不是使用您不知道大小的数据索引到数组中:

bool list::compareString(const char* array1, const char* array2)
{
    while (*array1 != '\0' || *array2 != '\0')
        if (*array1++ != *array2++) return false; // not the same character

    return true;
}
Run Code Online (Sandbox Code Playgroud)

对于不区分大小写的比较,将if条件替换为:

        if (tolower(*array1++) != tolower(*array2++)) return false;
Run Code Online (Sandbox Code Playgroud)

这样可以安全地转换为小写字符.

while循环检查字符串是否终止.它继续,而其中一个字符串尚未终止.如果只有1个字符串终止,则下一行 - if语句将意识到字符不匹配(因为只有1个字符'\0',并返回false.

如果字符串在任何时候都不同,则if语句返回false.

if语句也会对指针进行后递增,以便它在while循环的下一次迭代中测试下一个字符.

如果两个字符串相等,并且在某个时刻同时终止,则while条件将变为false.在这种情况下,return true语句将执行.


如果您想自己编写tolower函数,则需要检查字符是大写字母,而不是不同类型的字符(例如,多个符号).

这将是:

inline char tolower(char ch)
{
    return (ch >= 'A' && ch <= 'Z' ? (ch + 'a' - 'A') : ch);
}
Run Code Online (Sandbox Code Playgroud)