2013-10-30 37 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; 
} 
相关问题