2013-10-30 35 views
3

如何返回一個指向char數組中間某個東西的指針?如何返回指向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'; 
} 
+1

失敗路徑應該返回' null'不是'\ 0' - 技術上你返回字符值0並且隱式轉換爲'char *' –

+0

@oliver:什麼是'null'?你的意思是'NULL'或'nullptr'。 –

回答

5

你可以像下面這樣做

return &string[i]; 

或像這樣:

return string+i; 

這是同樣的事情。

返回'\0',一個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; 
} 
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; 
} 
+0

'EMPTY_STRING'對於一個空指針來說是一個誤導性的名字。還是你的意思是用''「'而不是零來初始化它? –

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; 
} 
相關問題