Как получить подстроку в 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);
}