如何返回指向字符数组中间某些内容的指针

How do I return a pointer to something in the middle of a char array?

本文关键字:中间 指针 数组 字符 何返回 返回      更新时间:2023-10-16

如何返回指向字符数组中间的指针?

// Returns a pointer to the first occurrence of the given character in the
// given string.
const char* strchr(const char* string, char charToFind) {
    for (int i = 0; i < strlen(string); i++) {
        if (string[i] == charToFind) {
            return string[i]; // <== THIS IS WRONG, How do I fix this?
        }
    }
    return '';
}

你可以这样做

return &string[i];

或者像这样:

return string+i;

这是一回事。

返回 '' (一个等于零的char常量)在逻辑上是不正确的:您应该为NULL指针返回0,或者如果您希望返回一个空的 C 字符串,您可以返回指向本地静态空字符串的指针,如下所示:

const char* strchr(const char* string, char charToFind) {
    for (int i = 0; i < strlen(string); i++) {
        ...
    }
    // Not found - return an empty string:
    static const char *empty = "";
    return empty;
}

如果你有一个指向字符串的指针,向它添加 N 将返回指向同一字符串部分的指针,从第 N 个字符开始(对于从零开始的计数)。

此外,最好为指向空字符串的指针提供一个常量。

static const char* EMPTY_STRING = '';
const char* strchr(const char* string, char charToFind) {
    for (int i = 0; i < strlen(string); i++) {
        if (string[i] == charToFind) {
            return string+i; 
        }
    }
    return EMPTY_STRING;
}

正如@dasblinkenlight提到的,&string[i]string + i都可用于返回指向字符串中间的指针。 正如@Oliver Matthews所说,如果未找到该字符,则应返回NULL。 也许超出了原始查询的范围,但出于性能原因,您可能希望避免调用 strlen() ,只需在扫描时检查字符串的结尾,如下所示:

const char* strchr(const char* string, char charToFind) {
    for (int i = 0; string[i]; i++) {    // Or you could say string[i] != ''
        if (string[i] == charToFind) {
            return string + i; 
        }
    }
    return NULL;
}