此函数用于查找字符串中最后一次出现的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;
}
答案 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;
%s
格式需要char*
。该函数返回char*
。你有你需要的一切!为什么在函数周围添加额外的*( )
???为什么??