Can';我不理解strcmp功能的一小部分
我正在读一本C语言的书,看到了这两个Can';我不理解strcmp功能的一小部分,c,strcmp,C,Strcmp,我正在读一本C语言的书,看到了这两个strcmp算法 我已经学会了usel for loop的工作原理 但这两个for循环对我来说是新的。我不懂这些部分 for(i=0;s[i]==t[i];i++) 它没有长度,而是有这个s[i]==t[i] for(;*s==*t;s++,t++)这家伙是什么意思 我理解其他部分,也知道这些函数返回什么 /* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */ int strcmp
strcmp
算法
我已经学会了usel for loop的工作原理
但这两个for循环对我来说是新的。我不懂这些部分
for(i=0;s[i]==t[i];i++)
它没有长度,而是有这个s[i]==t[i]
for(;*s==*t;s++,t++)
这家伙是什么意思代码>
/* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */
int strcmp(char *s, char *t)
{
int i;
for (i = 0; s[i] == t[i]; i++)
if (s[i] == '\0')
return 0;
return s[i] - t[i];
}
int strcmp(char *s, char *t)
{
for ( ; *s == *t; s++, t++)
if (*s == '\0')
return 0;
return *s - *t;
}
/*strcmp:return t*/
int strcmp(字符*s,字符*t)
{
int i;
对于(i=0;s[i]==t[i];i++)
如果(s[i]='\0')
返回0;
返回s[i]-t[i];
}
int strcmp(字符*s,字符*t)
{
对于(;*s==*t;s++,t++)
如果(*s=='\0')
返回0;
返回*s-*t;
}
在第一种情况下,for语句的后面的代码正在检查是否找到了字符串结尾标记,如果找到,函数将返回0
在第二个for
语句中,没有填写for
语句的初始化部分,因此该语句以for(;
开头。这是完全合法的
祝你好运。For循环有3个部分-初始化、条件和循环表达式。所有这些都是可选的。
所以这个循环-
for (i = 0; s[i] == t[i]; i++)
它一直运行到字符s[i]
等于t[i]
。这就是条件。如果为false,则循环中断
条件不一定总是基于长度
这个呢-
for ( ; *s == *t; s++, t++)
如上所述,初始化是可选的,这里不存在,这很好。此循环中的条件也相同,即循环,直到字符相等
for(i=0;s[i]==t[i];i++)//它没有长度
实际上,这段代码有点危险,因为它假设传递的字符串以NULL结尾(但稍后读取)。循环只在字符串的左侧部分相等时继续,因此,在循环中,遇到NULL时,唯一可能返回的结果是0(相等)(for(;;)条件确保两个字符串在同一位置都有NULL)
关于长度,无论如何,要计算它,你应该扫描整个字符串……并且扫描两次(因为有两个字符串)。这个循环将所有字符串合并在一个中。此外,C中的字符串必须以NULL结尾。当然,没有其他方法可以进行此比较
对于(;*s==*t;s++,t++)//这是什么意思
这与前面的步骤大致相同,但不是使用索引取消对s和t的引用(并且不涉及它们),它们被修改为一个接一个地指向字符。我相信这会更快,但取决于编译器。此外,递增s和t会丢失字符串的开头;但在这个函数中这不是问题
关于(;;)
的语法,一条注释已经解释了为什么它是这样写的。for()的最后一部分,在分号和右括号之间,在每次迭代后都会执行。在这种情况下,我们需要增加两个变量,因此有两个语句用逗号分隔
它不必是长度。
的循环一直运行到条件为真,因此在这种情况下,它意味着它将一直运行到s[i]
不等于t[i]
(;*s==*t;s++,t++)的
;
这里表示省略了for
循环的的第一个子句
bots
和t
在循环的之外定义,无需在此处定义
这是C标准允许的:
for(第1条;表达式-2;表达式-3)语句
(……)
第1条和表达式-3均可省略。省略的表达式-2为
替换为非零常量
某些编译器,如clang
在第一个子句中放入已定义的变量时会产生警告。例如,此代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
for (i; i < 10; i++)
puts("Hi");
return EXIT_SUCCESS;
}
首先,一些基础知识
for
循环的语法为
for ( expr1opt ; expr2opt ; expr3opt ) statement
将“永远”循环,除非循环体中某处有break
或return
语句
expr1
,如果存在,则在循环执行之前只计算一次-它用于建立一些初始状态(例如将索引设置为0,或分配指针值,或类似的内容)
expr2
(如果存在)将在循环体的每次迭代之前进行求值。这是继续循环执行的测试条件。如果表达式求值为非零值,则执行循环体;否则,将退出循环。如果缺少expr2
,则假定求值为1(true
)
expr3
(如果存在)将在循环体的每次迭代后进行评估。它通常会更新在expr2
中测试的内容
for(i=0;s[i]==t[i];i++)
它没有长度,而是有这个s[i]==t[i]
只要s[i]==t[i]
,这个循环就会执行;只要t[i]
不等于s[i]
,循环就会退出。这意味着,如果s
和t
都包含“foo”,那么这个循环就会运行到字符串的末尾
,则循环将按
s[0] == t[0] == 'f'
s[1] == t[1] == 'o'
s[2] == t[2] == 'o'
s[3] == t[3] == 0
s[4] == t[4] // danger, past the end of the string
因此,在循环体中,代码还检查a[i]
是否为0-如果是,这意味着我们已经将所有内容匹配到0终止符,并且字符串是相同的
所以,基本上,它是
s[0] == t[0] == 'f', s[0] != 0, keep going
s[1] == t[1] == 'o', s[1] != 0, keep going
s[2] == t[2] == 'o', s[2] != 0, keep going
s[3] == t[3] == 0, s[3] == 0, at end of s, strings match
对于(;*s==*t;s++,t++)
执行与第一个循环完全相同的操作,但它不使用[]
操作符索引到s
和t
,而是使用指针。
s[0] == t[0] == 'f'
s[1] == t[1] == 'o'
s[2] == t[2] == 'o'
s[3] == t[3] == 0
s[4] == t[4] // danger, past the end of the string
s[0] == t[0] == 'f', s[0] != 0, keep going
s[1] == t[1] == 'o', s[1] != 0, keep going
s[2] == t[2] == 'o', s[2] != 0, keep going
s[3] == t[3] == 0, s[3] == 0, at end of s, strings match