最后在字符串中出现char

时间:2014-03-17 18:10:04

标签: c string

此函数用于查找字符串中最后一次出现的char。例如

Enter a string: abcdefdfdfghh
Enter the target char in the string: f
Resultant string = fghh

我知道我的指针有些严重错误。有人可以帮我纠正吗?

char *strrchr2(char *s, char chr);

int main()
{
     printf("Enter a string value: \n");
     gets_s(s, sizeof(s));
     printf("Enter the character: \n");
     scanf_s("%c", &chr, 1);
     printf("Resultant string is: %s\n",*(strrchr2(s, chr)));
     _getch();
     return 0;
}


char *strrchr2(char *s, char ch1)
{

    char ns_q4[150];
    char *ns_ptr;
    int count = 0;
    char ans;

    int i = 0;
    ns_ptr = ns_q4;
    while (*(s + i) != '\0')
    {

        count++;
        i++;
    }
    s = &s[0];

  /*iterates from back,breaks when match found and from there iterates newly till end*/


    for (int j = count; j >= 0; j--)
    {
        if (*(s + j) = ch1)
        {
            for (int k = j; k < count; k++)
            {

                *ns_ptr = s[k];  
                ns_ptr++;
            }

            break;          }
    }
    ns_ptr = ns_q4;
    ans = *ns_ptr;

    return ans;

}

3 个答案:

答案 0 :(得分:3)

使用==代替=
if (*(s + j) = ch1)替换为if (*(s + j) == ch1)

另外,当你完成时,null会终止它:

ns_ptr++;
*ns_ptr = '\0';

并且这不是必需的:

s = &s[0]

您没有更改s指向

的内容

答案 1 :(得分:2)

这里不需要多个循环。要在ch1中找到s的最后一次出现,您需要做的就是:

char *last = NULL;
while (*s != '\0') {
  if (*s == ch1)
    last = s;
  ++s;
}
return last;

更新:尝试通过从字符串末尾迭代来提高效率是没有意义的,因为您首先必须先找到字符串的结尾。无论你是使用额外的循环,还是调用strlen(),结果是你正在迭代字符串的整个长度只是为了找到结束,然后向后迭代一些额外的数量以找到最后一次出现。我的方法只迭代整个字符串一次。从字符串末尾开始更有效的唯一方法是,如果您已经知道结束的位置,并且可以将该信息作为附加参数传递给strrchr2(),以便{{1}每次调用它时,都不必浪费时间再试一次。

答案 2 :(得分:1)

我甚至不打算尝试阅读您的代码。

相反:

char *strrchr2(char *s, char ch1)
{
    char* r;  // Return value set to NULL, in case ch1 is not found.
    for(r=NULL; s != '\0'; ++s)
    {
        r = (ch1 == *s)? s : r; // If the character is found...
    }
    return r;
}

如果你不喜欢这种三元形式:

char *strrchr2(char *s, char ch1)
{
    char* r;  // Return value set to NULL, in case ch1 is not found.
    for(r=NULL; s != '\0'; ++s)
    {
        if (ch1 == *s)
        {
            r = s; //If the character is found...
        }
    }
    return r;
}

在后续报道中,海报写道:

  

&#34;但错误显示在主要功能的声明中 - &gt;&gt; printf(&#34;结果字符串是:%s \ n&#34;,*(strrchr2(s,chr)));.我该如何纠正?&#34;

  1. 在引用错误时羞辱您,而不引用错误 信息。这条消息很重要!
  2. 不要让自己的生活变得艰难! %s格式需要char*。该函数返回char*。你有你需要的一切!为什么在函数周围添加额外的*( ) ???为什么??