3

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

// 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 '\0';
}
4

3 回答 3

7

你可以这样做

return &string[i];

或像这样:

return string+i;

这是同一件事。

返回'\0'一个char等于 0 的常量,在逻辑上是不正确的:你应该返回0一个NULL指针,或者如果你希望返回一个空的 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;
}
于 2013-10-30T15:40:48.187 回答
1

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

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

static const char* EMPTY_STRING = '\0';

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;
}
于 2013-10-30T15:40:39.017 回答
0

正如@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] != '\0'
        if (string[i] == charToFind) {
            return string + i; 
        }
    }
    return NULL;
}
于 2013-10-30T15:57:57.297 回答