Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中找到字符最右边的位置?_C_String - Fatal编程技术网

在C中找到字符最右边的位置?

在C中找到字符最右边的位置?,c,string,C,String,嘿,我想找出字符串中一个字符或多个字符的数字位置。我能够知道如何查看字符“a”在字符串“abcd”中的位置,但如果我输入“abcda”,它只打印出0,这意味着它只计算第一个实例。我要查找此字符串的最后一个或最右边的位置。以下是我目前掌握的情况: #include <stdio.h> main(){ char s[20]; char t[20]; int pp; printf("Enter a FULL string: \n"); scanf("%s", s); printf(

嘿,我想找出字符串中一个字符或多个字符的数字位置。我能够知道如何查看字符“a”在字符串“abcd”中的位置,但如果我输入“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;

        }
#包括
main(){
chars[20];
chart[20];
int-pp;
printf(“输入完整字符串:\n”);
scanf(“%s”,s);
printf(“输入要查找的内容:\n”);
scanf(“%s”,t);
pp=斯特林德斯(s,t);
printf(“%d”,pp);
}
/*字符串索引*/
int strindex(字符s[],字符t[]{
int i,j,k,c;
对于(i=0;s[i]!='\0';i++){
对于(j=i,k=0;t[k]!='\0'和&s[j]==t[k];j++,k++);
如果(k>0&&t[k]='\0')
返回i;
}
返回-1;
}
这可能很简单,但我一直在努力,绞尽脑汁,什么都没有出来。非常感谢

您正在寻找函数

char *str = strrchr("abcda", 'a');
int index = strlen("abcda")-strlen(str);
您正在寻找函数

char *str = strrchr("abcda", 'a');
int index = strlen("abcda")-strlen(str);
找到第一个“a”:

strchr("abcda", 'a'); // == "abcda"'s pointer
查找最后一个“a”:

strrchr("abcda", 'a'); // == "abcda"'s pointer + 4
找到第一个“a”:

strchr("abcda", 'a'); // == "abcda"'s pointer
查找最后一个“a”:

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

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

返回i
具有
lastOccurrence=i

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


此外,您的内部循环需要检查s[j]!='\“0”或您将在搜索时跳过输入字符串的结尾。

不要在找到匹配项后立即返回i,而是将i存储在另一个变量中

返回i
具有
lastOccurrence=i

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


此外,您的内部循环需要检查s[j]!='\“0”或您将在搜索时越过输入字符串的末尾。

因为其他答案表明有几种方法可以实现这一点(家庭作业)

第一种方法是寻找一个标准的库函数,它已经为您完成了这项工作。在UNIX或Linux系统上,您可能会发现使用
man-k string
并扫描字符串函数列表中的单词,如:find、search和locate。从中您可能找到了
strchr()
strrchr()
函数。后者正是你想要的

假设你的导师不会接受这样一个琐碎的解决方案,那么你有两个明显的方法。。。“向前”扫描字符串,始终记住“看到”目标字符的最近位置,或“向后”扫描字符串,并在第一次看到目标字符时中断循环

赋值的核心在于如何扫描(迭代)C中实现的字符串。令人遗憾的事实是,向后扫描字符串没有任何好处(除非给了你一个长度或指向字符串末尾的指针以及指向字符串头部的指针)。如果调用
strlen()
或更安全的
strnlen()
(这是一个常见的扩展,但从技术上讲不是标准的C库函数)。。。那么您就隐含了整个字符串扫描的成本/开销)


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

正如其他答案所示,有几种方法(家庭作业)

第一种方法是寻找一个标准的库函数,它已经为您完成了这项工作。在UNIX或Linux系统上,您可能会发现使用
man-k string
并扫描字符串函数列表中的单词,如:find、search和locate。从中您可能找到了
strchr()
strrchr()
函数。后者正是你想要的

假设你的导师不会接受这样一个琐碎的解决方案,那么你有两个明显的方法。。。“向前”扫描字符串,始终记住“看到”目标字符的最近位置,或“向后”扫描字符串,并在第一次看到目标字符时中断循环

赋值的核心在于如何扫描(迭代)C中实现的字符串。令人遗憾的事实是,向后扫描字符串没有任何好处(除非给了你一个长度或指向字符串末尾的指针以及指向字符串头部的指针)。如果调用
strlen()
或更安全的
strnlen()
(这是一个常见的扩展,但从技术上讲不是标准的C库函数)。。。那么您就隐含了整个字符串扫描的成本/开销)


因此,唯一合理有效的分配方法是向前扫描字符串,跟踪最近发现的匹配字符,直到找到字符串的结尾(ASCII NUL字符)。正如特雷弗指出的那样,传统上使用“sentinel”值-1表示未找到目标实例的情况。

目前的答案似乎忽略了您要搜索一个或多个字符的事实。下面是一个使用您定义的接口的简单解决方案,允许搜索字符串。抱歉,我没有尝试编译和测试这个

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;    
}

迄今为止的答案似乎忽略了您要搜索一个或多个字符的事实。下面是一个使用您定义的接口的简单解决方案,允许搜索字符串。对不起,我没有