我通过clang-format [见注 1] 运行了您的代码,以确认我对您在那里进行的奇怪的while 循环的怀疑,并且我想出这是您代码的正确格式:
#include <stdio.h>
int fun(char *str1)
{
char *str2 = str1;
while (*++str1)
;
return (str1 - str2);
}
int main()
{
char *str = "GeeksQuiz";
printf("%d", fun(str));
return 0;
}
我个人会这样写,以使while 循环超级明显。您可以在此处运行此代码:https://onlinegdb.com/BkxlKb75GO。
#include <stdio.h>
int fun(char *str1)
{
char *str2 = str1;
while (*++str1)
{
// do nothing
}
return (str1 - str2);
}
int main()
{
char *str = "GeeksQuiz";
printf("%d", fun(str));
return 0;
}
然而,更易读的是 fun() 函数,我也将其重命名为 count_num_chars_in_str():
int count_num_chars_in_str(char *str1)
{
char *str2 = str1;
while (*str1 != '\0')
{
str1++;
}
return str1 - str2;
}
较短的名称可能是 num_chars_in_str()、str_length() 或 strlen()。 strlen() 已经存在(see here 和 here),这正是它的作用。它可以包含在标头string.h 中,并且是C 和C++ 标准的一部分。这是它的描述on cplusplus.com:
size_t strlen ( const char * str );
获取字符串长度
返回 C 字符串 str 的长度。
C 字符串的长度由终止空字符确定:AC 字符串与字符串开头和终止空字符之间的字符数一样长(不包括终止空字符本身)。
这不应与保存字符串的数组的大小相混淆。
因此,运行上述任何程序,输出为9。程序所做的只是计算传入的字符串中非空字符的数量(其中空字符是0,或'\0'--相同的东西),在这种情况下是GeeksQuiz。 GeeksQuiz 包含 9 个非空字符。
顺便说一句,你的代码是从哪里得到的?请张贴链接和参考。您应该始终参考您的来源。
while (*++str) 只是不断增加str 指针一个字符,直到找到一个空终止符(0),它出现在字符串的末尾,在它的最后一个字符之后。一旦发生这种情况,就会取两个 char 指针之间的差异,从而导致在 z 右侧 之后的空终止符的地址位置与字符串,即G。这2个字符的内存地址相差9个字符。
不仅原始版本的可读性较差,而且其中还有一个错误。对于这个测试用例,它应该打印0,但它会打印1:
char *str = "\0";
printf("%d", fun(str));
我在count_num_chars_in_str() 中更易读的版本也纠正了这个错误。
教训:不要编写不可读或混淆的代码。
[注 1] 我通过clang-format 运行它的方式是将您的原始代码复制粘贴到main.c 文件中,然后将其复制到我的eRCaGuy_CodeFormatter 存储库中,然后运行./run_clang-format.sh。