2015-04-13 8 views
0

Я столкнулся с проблемой с парой строк. В нижней части моей первой функции я тестирую длину обеих строк, и даже если поискForLength должен быть меньше половины размера searchLength, они имеют одинаковую длину. Что здесь происходит?две строки должны быть разной длины, но считаются одинаковой длиной

Вот код:

#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] = «х '; ' –

+0

Правильно, вы, конечно, но редко больно создавать материал, если они не должны меняться :) –

+0

Конечно, и это также не гарантирует, что он не изменится, так как вы, как программист в c, всемогущий. –

Смежные вопросы