嘿所有,我正在尝试查找字符串中字符或字符数的数字位置。我能够弄清楚如何在字符串“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;
}
这可能很简单,但我一直在研究它,绞尽脑汁,没有任何东西出来。非常感谢!
答案 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;
}