两个字符串应该是不同的长度,但计算为相同的长度

时间:2015-04-13 00:41:49

标签: c arrays string

我遇到了一对字符串的问题。在我的第一个函数的底部,我测试两个字符串的长度,即使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;
}

2 个答案:

答案 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