我遇到了一对字符串的问题。在我的第一个函数的底部,我测试两个字符串的长度,即使searchForLength应该小于searchingLength的一半大小,它们也是相同的"长度"。这是怎么回事?
以下是代码:
#include <stdio.h>
#include <stdbool.h>
bool findString(const char searched[], const char searchingFor[]) {
int i, j, k = 0, searchedLength = sizeof(searched)/sizeof(searched[0]), searchingForLength = sizeof(searchingFor)/sizeof(searchingFor[0]);
bool in = false;
for (i = 0; i < searchedLength; i++) {
for (j = 0; j < searchingForLength; j++) {
if (searched[i] == searchingFor[j]) {
k++;
if (k == searchingForLength) {
in = true;
}
}
}
}
printf("%d\n", k);
printf("%d\n",searchingForLength);
printf("%d\n",searchedLength);
if (in == true) {
printf("Yes\n");
}
else {
printf("No\n");
}
return in;
}
int main (void) {
const char searched[] = { 'I', ' ', 'l', 'i', 'k', 'e', ' ', 'p', 'i', 'e' };
const char searchingFor[] = { 'l', 'i', 'k', 'e' };
findString(searched, searchingFor);
return 0;
}
答案 0 :(得分:3)
在编译时评估Sizeof,在这种情况下,它将返回指针的大小(char[]
或多或少是char*
)。您应该使用strlen
代替。
哦,正如已经提到的那样,你的字符串不是零终止的,所以这也不会真正起作用。您应该将字符串定义为
const char blah[] = "whee"
答案 1 :(得分:2)
sizeof
是一个运算符,它给出了它的参数类型的大小,这不是字符串的长度。
对于数组,它以字节为单位给出数组的大小,以计算所需字符串的长度strlen()
,但是你的数组都不是字符串,因此你不能使用strlen()
,它们不是ac字符串中的字符串。
c中的字符串是一系列非nul
字节,后跟nul
字节,您的数组没有终止nul
,因此{{1}函数无法正确处理它们。
str*
的简单实现将是
strlen()
如您所见,如果数据中没有size_t strlen(const char *string)
{
size_t length;
length = 0;
while (*string++ != '\0')
length++;
return length;
}
或'\0'
字节 1 ,该函数将继续迭代超出字符串的结尾,会发生什么之后是未定义的。
1 它们是相同的,它们的值是nul