Как получить подстроку в c с помощью strchr

Я пытаюсь получить часть строки.
У меня есть следующий код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char mystring[]="The quick brown fox jumps over the lazy dog";
char word1[]="The";
char * posb,pose;
char * word2;
int b,e,n;

n=memcmp(mystring, word1, sizeof(word1)-1);
if (n==0) printf("the first word is found!\n");
posb=strchr(mystring,' ');   // posb will be a pointer to the first character
b=posb-mystring+1;
printf("posb -> %d\n",posb);
printf("b -> %d\n",b);
pose=strchr(mystring+b+1,' ');   // pose will be a pointer to the second character
printf("calc e\n");
e=pose-sizeof(mystring)+1;
printf("pose -> %s\n",pose);
printf("e -> %d\n",e);
word2 = (char*) malloc (sizeof(char)*(e-b));
memcpy(word2, posb, sizeof(word2));
printf("%s:%i:%i:%i\n",word2, b, e, e-b);
free (word2);

Проблема в том, чтобы получить второе слово и сохранить его в word2. Для этого я пытаюсь использовать strchr чтобы найти места. Но второй раз пользуюсь strchr Мне нужно смещение, чтобы найти второе место. Я попробовал следующее:

pose=strchr(mystring+b+1,' ');
pose=strchr(&mystring[b+1],' ');

Переменные b а также e должен содержать позиции пробела в mystring, word2 должен содержать quick в конце концов.
Другим решением было бы "пройти через" строку, используя цикл, но это было бы обманом strchr функция.

2 ответа

Чтобы получить второе слово, отметьте это

char mystring[] = "The quick brown fox jumps over the lazy dog";
char word1[] = "The";
char * posb, pose;
char * word2;
int b, e, n;

n = memcmp(mystring, word1, sizeof(word1)-1);
if (n == 0) printf("the first word is found!\n");
posb = strchr(mystring, ' ');   // posb will be a pointer to the first character

b = posb - mystring + 1;

printf("posb -> %d\n", posb);
printf("b -> %d\n", b);
posb = strchr(posb + 1, ' ');   // pose will be a pointer to the second character
printf("calc e\n");

e = posb - mystring + 1;
printf("e -> %d\n", e);

word2 = (char*)malloc(sizeof(char)*(e - b));
memcpy(word2, mystring + b, e - b);
word2[e-b-1] = '\0';
printf("%s:%i:%i:%i\n", word2, b, e, e - b);
free(word2);

При поиске строки для вхождения слова вам нужен указатель для перемещения по каждому символу в строке, поисковый запрос, сравнение текущего символа с первым символом в поисковом запросе, дальнейшее сравнение, если есть совпадение, и затем набор разделителей для ограничения сравнений, как требуется, например, при поиске 'the' только матч 'the' и не 'they', 'them', 'then', 'there', так далее...

Вы можете использовать базовую арифметику в своих интересах, чтобы убедиться, что вы не пытаетесь проверять строки, длина которых меньше длины поискового запроса, и т. Д. Краткий пример (изменение начального 'The' в 'the' в вашей строке для примера), вы можете сделать что-то похожее на следующее. Обратите внимание, что при поиске используется только базовая оптимизация, и она не является исчерпывающим примером:

#include <stdio.h>
#include <string.h>

int main (int argc, char **argv)
{
    char line[] = "the quick brown fox jumps over the lazy dog.";
    char *p = line;
    char *sterm = argc > 1 ? argv[1] : "the";
    char *delim = " \t\n\'\".";
    size_t llen = strlen (line);
    size_t count = 0, slen = strlen (sterm);

    printf ("\n searching line for '%s'\n\n", sterm);

    for (;p < (line + llen - slen + 1); p++) {

        if (*p != *sterm)
            continue;   /* char != first char in sterm  */
        if (p > line && !strchr (delim, *(p - 1)))
            continue;   /* prior char is not a delim    */
        if (!strchr (delim, *(p + slen)))
            continue;   /* next char is not a delim     */
        if (strncmp (p, sterm, slen))
            continue;   /* chars don't match sterm      */

        printf ("   match %2zu. '%s' at location %zu\n",
                ++count, sterm, p - line);
    }

    printf ("\n total occurrences of '%s' in line : %zu\n\n",
            sterm, count);

    return 0;
}

Использование / вывода

$ ./bin/searchline

 searching line for 'the'

   match  1. 'the' at location 0
   match  2. 'the' at location 31

 total occurrences of 'the' in line : 2

$ ./bin/searchline fox

 searching line for 'fox'

   match  1. 'fox' at location 16

 total occurrences of 'fox' in line : 1

Обратите внимание на использование strchr с разделителем строк delim используя текущий символ в качестве char, Посмотрите на пример и дайте мне знать, если у вас есть какие-либо вопросы. Ваша точная цель была немного неясной из вашего вопроса, поэтому, если я пропустил ваше намерение, дайте мне знать.

Использование индексов массива вместо указателя

Если вам удобнее использовать индексы символьных массивов вместо указателей, вы всегда можете удалить указатель p и настроить логику цикла соответственно:

    for (i = 0; i < (llen - slen + 1); i++) {

        if (line[i] != *sterm)
            continue;   /* char != first char in sterm  */
        if (i && !strchr (delim, line[i-1]))
            continue;   /* prior char is not a delim    */
        if (!strchr (delim, line[i+slen]))
            continue;   /* next char is not a delim     */
        if (strncmp (&line[i], sterm, slen))
            continue;   /* chars don't match sterm      */

        printf ("   match %2zu. '%s' at location %zu\n",
                ++count, sterm, &line[i] - line);
    }
Другие вопросы по тегам