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 に等しい定数'\0'であるを返すことは、論理的に正しくありません: ポインターを返す必要があります。または、空の C 文字列を返したい場合は、次のように、ローカルの静的な空の文字列へのポインターを返すことができます。char0NULL

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 番目の文字から始まる部分へのポインターが返されます (0 から始まるカウントの場合)。

また、空の文字列へのポインターには定数を使用することをお勧めします。

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 に答える