-3

我的任务是编写我自己的 strchr 版本,但它似乎不起作用。任何建议将不胜感激。这里是:

char *strchr (const char *s, int c) //we are looking for c on the string s
{

    int dog; //This is the index on the string, initialized as 0
    dog = 0;
    int point; //this is the pointer to the location given by the index
    point = &s[dog];
    while ((s[dog] != c) && (s[dog] != '\0')) { //it keeps adding to dog until it stumbles upon either c or '\0'
            dog++;
            }
    if (s[dog]==c) {
            return point; //at this point, if this value is equal to c it returns the pointer to that location
            }
    else {
            return NULL; //if not, this means that c is not on the string
            }
}
4

4 回答 4

4

您返回最初初始化为字符串开头并且此后未移动的“point”。您根本不需要该变量,但可以简单地返回 &s[dog] (尽管我更喜欢比 dog 更具描述性的东西作为变量名)。

实际上,您可以通过以下简单的方式生存:

while (*s != c && *s)
    ++s;

return (*s == c) ? s : NULL; 
于 2012-07-08T21:08:59.140 回答
4

您正在尝试将地址存储到point其中,但它是一个 int 变量。你应该这样做:

char *strchr(char *s, char c) {
    int pos = 0;
    while (s[pos] != c && s[pos] != '\0')
        pos++;
    if (s[pos] == c)
        return &s[pos];
    else
        return NULL;
}

顺便说一句:不s应该是因为你返回一个指向 a 的指针,那不是一个好的风格;)(或 return )char *const char *charconst char *

于 2012-07-08T21:16:06.137 回答
0
int point;

这不是指针的声明,这里是如何声明指向 an 的指针int

int *bla;

在您的情况下&s[dog]是指向 a 的指针const char,因此您想以point这种方式声明:

 const char *point;

正如其他人指出的那样,之后您实际上在函数中忽略了这个指针。

于 2012-07-08T21:06:43.170 回答
0

在您的代码中

int point; //this is the pointer to the location given by the index
point = &s[dog];

您正在尝试将指向 char 的指针转换int

char* point = &s[dog];

是你想要的。您应该已经从函数的返回类型中看到了这一点。你想返回一个char*,但你返回一个int(你的变量point)或NULL。由于您从未真正更改point,因此您实际上是在返回数组中第一个字符的地址,因此您的代码无论如何都无法正常工作。如果你坚持这一点,你会更好地使用

char* point = &s[dog];
while ((*point != c) && (*point != '\0')) {          
   ++point;
}
return (*point == c) ? point : NULL;

但是在这里,您似乎仍然有一个概念问题,因为您想将 achar与a 进行比较int。您应该确定是否需要int数组或char数组。如果您想要一个char数组,请将您的输入参数更改c为 type char

于 2012-07-08T21:10:45.487 回答