我的教授向我们展示了函数的示例实现,以查找字符串的长度,并说这是在没有实际使用strlen()
函数的情况下执行此操作的方法:
int length(char word)
{
int i;
for (i = 0; word[i]!='\0'; i++)
{
{
}
}
return i;
}
她说,对strcat()
,strcmp()
和strcpy()
执行类似操作符合我们的最佳利益,以了解函数的实际工作方式。
这个功能发生了什么?我可以从这个例子中学到什么来帮助我重新实现其他三个吗?
答案 0 :(得分:1)
关于strlen,它遍历char数组,找到第一个空字节。
size_t length( const char * word)
{
size_t i = 0; // Counter
while(word[i] != '\0') // Compare current position to null
{
i++;
}
return i; // Return position.
}
答案 1 :(得分:1)
您似乎在问多个问题,我会尝试回答您的第一个问题。
您的上述功能无效,无法编译或工作。
这是strlen
的实现。
size_t strlen(char s[])
{
size_t i;
i = 0;
while (s[i]= != '\0') //loop over the array, if null is seen, break
++i;
return i; // return length (without null)
}
关于解释,C中的strings
表示为字符数组。必须有一种逻辑方式来表示字符串的结尾,在我们的例子中是空字符\0
。请注意,字符串需要n+1
存储,strlen
的大多数实现都会返回字符串的长度,不包括空字符。
您可能想知道\0
代表什么,在C中,空字符表示字符常量,ASCII中的值为0.您可以写0,而不是添加\0
来强调性质字符串。
同样,使用指针算法
的strlen
的另一个实现
size_t strlen(char *s)
{
char *p = s;
while (*p != '\0')
++p;
return p - s; //use ptrdiff_t or size_t?
}
另外,strcat是好的措施。
void strcat(char s[], char t[])
{
int j, k;
j = k = 0;
while (s[j] != '\0') // are we at the end of s?
++i;
while ((s[j++] = t[k++]) != '\0') // copy t to s
; // null statement
}
库实现返回一个指向字符串的指针,而不是void;见男人3 strcat
在strcat
中,字符从t
复制(顺序)到s
的末尾。常见的C语言是在循环中递增步进变量。复制每个字符时,步进变量将递增到下一个字符的位置。
由于C中数组的内部表示形式为指针(通过引用返回),因此可以使用void
返回值。
此实现中的毁灭性错误是我们假设s
足以容纳所有s + t + 1
。为了简洁起见,我忽略了这个问题。
答案 2 :(得分:1)
首先,你需要知道 C中的字符串是什么?。字符串是一个非零字节数组(char
),通常是可打印字符,以null结尾(零,由字符'\0'
表示)。
然后,您需要知道for
循环的工作原理:
for ( initial condition ; test condition ; loop expression )
{
// some code
}
// Code after the loop
for
循环将:
有了基础知识,让我们看一下老师给出的功能:
int length(char *word)
{
int i;
for (i = 0; word[i] != '\0'; i++)
{
{
}
}
return i;
}
函数的主要部分是for
循环:然后经过for
循环步骤:
i
设置为0
。 i
表示字符串的索引(char
数组)。word[i] != '\0'
(换句话说,如果这是真的,那么它不是字符串的结尾)。循环中没有代码可以执行,所以我们直接进入第3步。i
,字符串(char
数组)索引,这意味着我们现在指向字符串中的下一个字符。 如果你的话是" cat",那么数组是{ 'c', 'a', 't', '\0' }
。所以循环步骤将执行此操作:
i
设为0
。word[0] != '\0'
,检查'c' != '\0'
。这是正确的,因为'c'
不等于'\0'
。i++
(增量i
),现在i
为1
。word[1] != '\0'
,检查'a' != '\0'
。这是正确的,因为'a'
不等于'\0'
。i++
(增量i
),现在i
为2
。word[2] != '\0'
,检查't' != '\0'
。这是正确的,因为't'
不等于'\0'
。i++
(增量i
),现在i
为3
。word[3] != '\0'
,检查'\0' != '\0'
。这是假的,因为'\0'
等于'\0'
。循环结束时i
的值是多少?它是3
,这是字符串的长度,因为我们一直踩过字符串,一次一个字符,从i
递增0
直到我们点击之后字符串的最后一个字符,即'\0'
。
然后该函数返回i
,即字符串的长度。
HTH