如何使用C从起始索引搜索char* 中的子字符串?

643ylb08  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(147)

下面的循环调用了parseXML()函数:

...

char buffer[MAX_BUFSIZE];
memset(buffer, 0, sizeof(buffer));
int bytes_received = tcp_read(socket, buffer, sizeof(buffer));

...

int bytes_read_total = 0;
while (bytes_read_total < bytes_received) {
        
    int bytes_read = 0;
    Person* person = parseXML(buffer, bytes_received - bytes_read_total, &bytes_read);

    if (person == NULL) break;

    bytes_read_total += bytes_read;
    savePerson(person);

}

这里是parseXML()函数的开始:

Person* parseXML(char* buffer, int bufSize, int* bytesRead) {
    
    char* startTag = strstr(buffer, "<person>");
    char* endTag = strstr(buffer, "</person>");
    if (startTag == NULL || endTag == NULL) {
        return NULL;
    }

    Person* person = newPerson();
    
    int personLength = endTag + strlen("</person>") - startTag;

    char* personBuffer = (char*)malloc(personLength + 1);
    memcpy(personBuffer, startTag, personLength);
    personBuffer[personLength] = '\0';

    ...

    free(personBuffer);
    *bytesRead = personLength + 1;
    return person;

当前使用strstr()时,它总是在每次迭代中查找xml中的第一个人,而不是从bytesRead偏移量开始搜索。请让我知道如何解决这个问题。

rsl1atfo

rsl1atfo1#

strstr接受一个char指针作为它的第一个参数,当它到达一个空字符(字符串结束)时停止搜索。
指针可用于算术运算,例如:

int nums[2] = {1, 2};
    int *secondnum = nums + 1;  // "nums" array decays (turns) into a pointer
    printf("%d\n", *secondnum);  // prints "2"

因此,要使用strstr从偏移量开始搜索字符串,您需要做的就是递增指针:

char *haystack = "foo 1, foo 2";
    char *needle = "foo";

    char *first_foo = strstr(haystack, needle);
    char *second_foo = strstr(first_foo + strlen(needle), needle);
    printf("%td\n", second_foo - haystack);  // prints "7", the position of the second "foo"

strstr没有找到子字符串时,它返回一个NULL指针。您可以执行以下操作来检查是否找到子字符串:

char *found = strstr(haystack, needle);
    if (found != NULL) {
        // found is a pointer to the position of the substring
    } else {
        // substring not found
    }

相关问题