Найти первую позицию символа в строке C - PullRequest
0 голосов
/ 04 мая 2019

Найти первую позицию символа c в строке

Вот мой код функции

int char_index(int c, char *string) {
    int flag = 0;
    int i = 0;
    int index = 0;

    for(i = 0; string[i] != '\0'; i++){
        if (string[i] == c){
            flag++;
        }
        if (flag == 0){
            index = NOT_IN_STRING;
        } 
        else {
            index = i+1;
        }
    }
    return index;
}

Ожидается, что функция вернет позицию символа, если символ не существует, возвращаемое значение должно быть: NOT_IN_STRING

Ответы [ 5 ]

2 голосов
/ 04 мая 2019

Вы не прерываете цикл, даже когда целевой символ находится в строке. Таким образом, длина строки будет возвращена как индекс целевого символа.

Также лучше, когда функция возвращает объект типа size_t вместо int.

И объявление функции должно выглядеть так:

size_t char_index( const char *s, char c );

то есть указатель должен иметь квалификатор const, потому что строка не изменяется внутри функции.

Примите во внимание, что стандарт C включает в себя почти аналогичную функцию strchr, которая объявлена ​​как

char * strchr( const char *s, char c );

Вот демонстрационная программа, которая показывает, как эта функция может быть реализована.

#include <stdio.h>

#define NOT_IN_STRING   ( size_t )-1

size_t char_index( const char *s, char c )
{
    size_t i = 0;

    while ( s[i] != '\0' && s[i] != c ) ++i;

    return s[i] != '\0' ? i : NOT_IN_STRING;
}

int main( void )
{
    const char *s = "Betty";

    for ( size_t i = 0; s[i] != '\0'; i++ )
    {
        printf( "%c: %zu\n", s[i], char_index( s, s[i] ) );
    }
}

Вывод программы

B: 0
e: 1
t: 2
t: 2
y: 4

Показанная функция исключает завершающий ноль из поиска. Если вы хотите включить завершающий ноль в поиск, просто измените оператор возврата функции следующим образом

return s[i] == c ? i : NOT_IN_STRING;
0 голосов
/ 04 мая 2019

Пара проблем в этом коде.Сначала флаг, если символ найден в строке, так что flag++, но что происходит, когда символ появляется в строке более одного раза?флаг будет равен 2,3 и т. д., таким образом, у вас будет только последний индекс в строке, которой был символ.Чтобы решить эту проблему, добавьте в цикл for str[i] && !flag.Кроме того, вы проверяете, является ли символ равным int без какого-либо приведения (str[i] == c), измените его с помощью функции atoi () или обычного простого приведения.Удачи!Джеймс

0 голосов
/ 04 мая 2019

Здесь у вас есть еще один вариант:

int instring(int c, const char *str)
{
    int result = NOT_IN_STRING;
    const char savedstr = str;

    while(*str)
    {
        if(*str == c)
        {
            result = str - savedstr;
            break;
        }
        str++;
    }
    return result;
}

и вот сравнение https://godbolt.org/z/uCBRm2

0 голосов
/ 04 мая 2019

Не используйте все эти индексы. Это слишком сложно для чтения.

/* Find first occurence of a character in a string. */
#include <stdio.h>

#define NOT_IN_STRING -1

int
char_index(int c, const char *string)
{
        const char *start = string;
        while( *string != c && *string ) {
                string++;
        }
        return ( *string == c) ? string - start : NOT_IN_STRING;
}

int
main(int argc, char **argv)
{
        const char *needle = argc > 1 ? argv[1] : "";
        const char *haystack = argc > 2 ? argv[2] : "abcdefgh";

        printf("Target string: %s\n", haystack);
        while(*needle) {
                printf("\t%c: %d\n", *needle, char_index((int)*needle, haystack));
                needle += 1;
        }
        return 0;
}
0 голосов
/ 04 мая 2019

Рассмотрите возможность использования char *strchr(const char *string, int c); из стандартной библиотеки.

В любом случае функция должна выполняться следующим образом:

int char_index(char c, char *string) {
    for (int i = 0; string[i] != '\0'; i++)
        if (string[i] == c)
            return i;

    return NOT_IN_STRING;
}
...