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

时间:2016-03-07 22:57:11

标签: c

/* 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] != '\0')
    {
        int j = 0;
        while (s2[j] != '\0')
        {
            if (s2[j] == s1[i])
            {
                loc = (int)s1[i];
                return loc;
            }
            j++;
        }
        i++;
    }
    return loc;
}

写一个返回的函数(s1,s2) 字符串s1中的第一个位置 出现字符串s2中的字符,如果s1出现,则返回-1 s2中不包含任何字符。 例如,任何(“这很有趣”,“鳍”)都会返回 2,('f'出现在第8位,'i'出现在2,和 10)中的'n',而任何(“这很有趣”,“死”)都会返回 -1

方向^^

你们有没有看到任何问题?当它应该返回时,它返回105.我检查了ascii表,并且与8不相关D:

2 个答案:

答案 0 :(得分:2)

loc = (int)s1[i];不返回字符的位置,但字符值本身以ASCII格式返回。您要返回的内容是iloc = i;

答案 1 :(得分:0)

正如我的评论和许多其他人所述,你将返回字符匹配的字符的值而不是位置(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 chars\n"); }
    else { printf("%d\n", 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: %c\n", *ret);
    } else { printf("No matching chars\n"); }

    return(0);
}