找到C中最右边的字符?

时间:2009-10-19 23:17:09

标签: c string

嘿所有,我正在尝试查找字符串中字符或字符数的数字位置。我能够弄清楚如何在字符串“abcd”中查看字符“a”的位置,但如果我输入“abcda”它只打印出0,这意味着它只计算第一个实例。我想找到这个字符串的最后或最右边的出现。这是我到目前为止所做的:

#include <stdio.h>


main(){

char s[20];
char t[20];
int pp;
printf("Enter a FULL string: \n");
scanf("%s", s);

printf("Enter what you want to find: \n");
scanf("%s", t);

pp = strindex(s, t);

printf("%d", pp);

}



/* string index */

int strindex(char s[], char t[]){

int i, j, k, c;

for (i = 0; s[i] != '\0'; i++){

for (j=i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++);
if (k > 0 && t[k] == '\0')

return i;




}
return -1;

        }

这可能很简单,但我一直在研究它,绞尽脑汁,没有任何东西出来。非常感谢!

5 个答案:

答案 0 :(得分:8)

您正在寻找strrchr功能。

char *str = strrchr("abcda", 'a');
int index = strlen("abcda")-strlen(str);

答案 1 :(得分:5)

不要在找到事件后立即返回i,而是将i存储在另一个变量中。

即。更换 return i;lastOccurence = i;

lastOccurrence应该在函数开始时初始化为-1,然后在结束时返回。

此外,你的内部循环需要检查s [j]!='\ 0',否则你将在搜索时超过输入字符串的末尾。

答案 2 :(得分:2)

首先找到'a':

strchr("abcda", 'a'); // == "abcda"'s pointer

找到最后一个'a':

strrchr("abcda", 'a'); // == "abcda"'s pointer + 4

答案 3 :(得分:0)

正如其他答案所表明的,有两种方法(家庭作业)。

首先要实际寻找已经为你完成工作的标准库函数。在UNIX或Linux系统上,您可能会发现使用man -k string并扫描字符串函数列表,例如:find,search和locate。从那以后,您可能找到了strchr()strrchr()函数。后者正是你所要求的。

假设您的教练不接受这样一个简单的解决方案,那么您有两种明显的方法...通过字符串“向前”扫描,始终记住您“看到”目标角色的最近位置,或“向后扫描” “通过字符串并在第一次看到目标角色时突破循环。

分配的核心在于如何扫描(迭代)字符串,因为它们在C中实现。可悲的事实是向后扫描字符串没有任何优势(除非你给了一个长度或指针字符串的结尾以及字符串的一部分)。如果您调用strlen()或更安全的strnlen()(这是一个常见的扩展,但在技术上不是标准C库函数)...那么您已经隐含地承担了完整字符串扫描的成本/开销)。

因此,这个分配唯一合理有效的方法是向前扫描字符串,跟踪最近发现的匹配字符,直到找到字符串的结尾(ASCII NUL字符)。正如Trevor所指出的那样,使用-1的“哨兵”值来表示没有找到目标实例的情况。

答案 4 :(得分:0)

看起来日期的答案忽略了您要搜索字符或字符这一事实。所以这是使用您定义的接口的简单解决方案,允许搜索字符串。对不起,我没有尝试编译和测试它。

int strindex( const char s[], const char t[] )
{             
    int ret = -1; /* return -1 if target not found */
    int len1 = strlen(s);
    int len2 = strlen(t);
    if( len1 >= len2 )
    {
        int i;
        for( i=len1-len2; i>=0; i-- )
        {
            if( 0 == memcmp(s+i,t,len2) )
            {
                ret = i; /* found target t at idx i */
                break;        
            }
        }
    }
    return ret;    
}