2015-04-13 29 views
0

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

sizeof是运营商,它给它的参数,它是不是一个字符串的长度类型的大小。

对于数组它给数组的大小以字节为单位,计算你需要strlen()一个字符串的长度,但没有你的阵列是字符串,因此你不能用strlen(),他们不是在交流串字符串意义。

在C字符串,是不可nul字节后跟一个nul字节的顺序,你的阵列没有终止nul,所以str*功能无法妥善处理。

一个简单的实施strlen()

size_t strlen(const char *string) 
{ 
    size_t length; 
    length = 0; 
    while (*string++ != '\0') 
     length++; 
    return length; 
} 

,你可以看到,如果没有'\0'nul字节中的数据,该功能将保持迭代超过字符串的结尾,之后会发生什么是未定义的。


他们是相同的,它们的价值是0

+0

我可以建议你在你指的“不是字符串的字符串”的地方有选择地使用's/string/array /'吗?这样,这个答案会更有意义。 – Sebivor

3

的sizeof在编译时被评估,并且在这种情况下,它会返回一个指针的大小(char[]或多或少一个char*)。您应该使用strlen

哦,正如它已经提到,你的字符串不是零终止的,所以也不会真的有效。你应该定义你的字符串作为

const char blah[] = "whee" 
+0

顺便说一句,这个数组声明不需要'const',你可以做到完美'胡说[0] =“X ';' –

+0

你当然是对的,但是如果它们不应该改变,它很少会伤害到const const –

+0

当然,它也不能保证它不会改变,因为你作为c程序员是全能。 –

相关问题