/* 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:
答案 0 :(得分:2)
loc = (int)s1[i];
不返回字符的位置,但字符值本身以ASCII格式返回。您要返回的内容是i
,loc = 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);
}