2015-04-13 66 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程序員是全能。 –

相關問題