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循环在其起始参数中具有起始,结束和递增条件,但为此,这似乎可能不适用.
我要问的是,我应该如何格式化这个循环,是否有更有效的方法呢?
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)