编写一个函数 any(s1, s2),该函数返回字符串 s1 中出现字符串 s2 中任何字符的第一个位置


/* Program to return first location in the string s1 where any charater in a string s2 occurs or -1 if s1 does not contain any character in s2 */
#include<stdio.h>
#include<limits.h>
int main(void)
{
    char s1 [] = "This is fun";
    char s2 [] = "fin";
    int loc = theF(s1, s2);
    printf("%d", loc);
    printf("n");
    return 0;
}
int theF(char s1 [], char s2 [])
{
    int i = 0;
    int loc = -1;
    while (s1[i] != '')
    {
        int j = 0;
        while (s2[j] != '')
        {
            if (s2[j] == s1[i])
            {
                loc = (int)s1[i];
                return loc;
            }
            j++;
        }
        i++;
    }
    return loc;
}

编写一个返回的函数 any(s1, s2)字符串 S1 中的第一个位置,其中任何字符串 S2 中出现字符,如果 S1 出现字符,则出现 -1S2 中不包含任何字符。例如,any("This is fun", "fin") 返回2,("f"出现在位置8,"i"出现在位置2,并且10中的'n'),而any("这很有趣","死")返回-1.

方向^^

你们看到任何问题了吗?它返回 105,而它应该返回 8。我检查了 ascii 表,不幸的是,这与 8 D 没有相关性:

loc = (int)s1[i];

返回字符的位置,而是返回 ASCII 格式的字符值本身。您要返回的是iloc = i;

因此,正如我的评论和许多其他评论中所述,您返回的是字符匹配的字符的值,而不是位置 (i/j)。修复了下面的代码,但有一些细微的编码差异。虽然在我看来循环可能会令人困惑,但使用 for 循环来说明它将循环直到两个字符串的完整长度似乎更容易阅读。

#include <stdio.h>
#include <string.h>
int any(char s1 [], char s2 []);
int main(void){
    char s1 [] = "This is fun";
    char s2 [] = "fin";
    int loc = any(s1, s2);
    if ( loc == -1 ){ printf("No matching charsn"); }
    else { printf("%dn", loc); }
    return 0;
}
int any(char s1 [], char s2 []){
    int i = 0, j = 0;
    for ( i = 0; i < strlen(s1); i++ ){
        for ( j = 0; j < strlen(s2); j++ ){
            if (s1[i] == s2[j]){
                return i; // i+1 depending on literal placement
                      //   vs zero indexed arrays
            }
        }
        j=0;
    }
    return -1;
}

正如 Steve Summit 所提到的,这正是函数 strpbrk() 所做的。使用它的简单实现是:

#include <stdio.h>
#include <string.h>
int main (){
    const char s1[] = "This is fun";
    const char s2[] = "fin";
    char *ret;
    ret = strpbrk(s1, s2);
    if(ret){
        printf("First matching character: %cn", *ret);
    } else { printf("No matching charsn"); }
    return(0);
}

这是我编写的上一个代码更清晰、更简单的代码。

所以逻辑基本上只是检查 wantbefindloc 字符在 yourstring 中第一次出现,一旦找到,我们返回索引 j 的位置,因为它是两个字符的第一个匹配项。

如果我们遍历整个字符并且没有返回任何内容,这意味着找不到匹配项。因此,我们返回 -1

请注意,您根本不需要更新任何索引,也不需要加载头文件,但 stdio

#include<stdio.h>
int any();
int main() 
{
    int loc;
    char yourstring[] = "This is fun";
    char wantbefindloc[] = "dead";
    loc = any(yourstring, wantbefindloc);
    printf("%d", loc);
    return 0;
}
int any(char s1[], char s2[]) 
{
    int i, j;
    for (i = 0 ; s2[i] != ''; i++) 
    {
        for (j = 0 ; s1[j] != ''; j++) 
        {
            if (s1[j] == s2[i]) 
            {
                return j;
            }
        }
    }
    return -1;
}

相关内容

最新更新