2015-04-30 3 views
1

Предположим, что я хочу сделать функцию какЧто такое эквивалент «size_t» в C?

int indexOf (char * str, char c) 
{ 
    // returns the index of the chracter c in the string str 
    // returns -1 if c is not a character of str 
    int k = 0; 
    while (*str) 
    { 
     if (*str == c) break; 
     else ++str; 
    } 
    return *str ? k : -1; 
} 

, но я хочу, чтобы сделать его максимально надежным, насколько это возможно. Например, вышесказанное работает только в том случае, если наибольшее значение int будет больше или равно максимальному размеру массива символов. Как я могу покрыть все свои базы в чистом C?

+3

(http://en.cppreference.com/w/c/string/byte/strchr) – dasblinkenlight

+1

size_t присутствует в стандарте C99, что вы подразумеваете под словом «pure C»? – myaut

+0

Вы предполагали увеличивать 'k' в этом цикле? – Hurkyl

ответ

9

size_t

Нет, серьезно. size_t - стандартный тип C. Он определен в <stddef.h>.

(это был ответ на «Что является эквивалентом„size_t“в C?»)

Для точной функции, как вы написали, strchr будет более подходящим - абонент может использовать его как это:

const char* str = "Find me!find mE"; 
char* pos = strchr(str, '!'); 
if(pos) // found the char 
{ 
    size_t index = (pos - str); // get the index 
    // do the other things 
} 
else 
{ 
    // char not found 
} 

Таким образом, в общем случае, если вы хотите найти что-то в массиве, предоставленной пользователем, возвращая указатель наиболее идиоматических в С.

Вам может return ssize_t (который включает в себя все возможные значения size_t и -1), но это не стандарт C, поэтому я не рекомендую его. Я только упоминаю об этом для полноты.

+1

Я думаю, что OP будет любопытно, как бороться с 'return -1' частью его кода. – dasblinkenlight

+1

OP знает о существующем size_t. Однако ваш ответ не показывает, как вернуть -1 или эквивалент. – 2501

+0

@ 2501 Я думаю, что на вопрос нужно только знать, присутствует ли символ в строке и индексе. Если возврат отличается от -1, в то время как вы знаете, что является возвратом, подтверждающим, что вы хотите, это нормально. (Тем не менее, вы правы) – Shondeslitch

4

Используйте указатель.

Вы всегда сможете вернуть указатель на действительный элемент в массиве. Не найденное условие сигнализируется возвратом NULL.

+2

Почему downvote? Это правильный способ сделать 'strchr' в C, никаких вопросов об этом. – dasblinkenlight

0

Устный ваш вопрос:

How to not rely in index size for pointer arithmetic?

Ответ будет: [? Зачем изобретать колесо]

int indexOf (char * str, char c) 
{ 
    // returns the index of the chracter c in the string str 
    // returns -1 if c is not a character of str 
    char *aux = str; 
    while (*aux != c) 
    { 
     if (*aux == '\0') 
      return -1; 
     aux++; 
    } 
    return aux - str; 
} 
+0

Разделение в любом случае неправильное, если оно было для другого типа. 'ptr + 1' указывает на следующий элемент, а не на следующий байт. – milleniumbug

+0

Вы правы, хотя операция между двумя указателями игнорирует размер шрифта. –

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