/* 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 格式的字符值本身。您要返回的是i
,loc = 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;
}