C练习返回关于第一个位置的信息

C练习返回关于第一个位置的信息,c,clion,C,Clion,练习C: 编写一个函数“any”,该函数返回有关s1中第一次出现的位置的信息以及来自s2的任何lsign。当s1不包含s2的符号时返回-1。 我的代码是: #include <stdio.h> #include <stdlib.h> int any(char s1[], char s2[]) { int i, j; int koniec; for (i = 0; s2[i] != '\0'; i++) { for (j = 0;

练习C: 编写一个函数“any”,该函数返回有关s1中第一次出现的位置的信息以及来自s2的任何lsign。当s1不包含s2的符号时返回-1。 我的代码是:

#include <stdio.h>
#include <stdlib.h>

int any(char s1[], char s2[]) {
    int i, j;
    int koniec;
    for (i = 0; s2[i] != '\0'; i++) {
        for (j = 0; s1[j] != '\0'; j++) {
            if (s1[j] == s2[i]) {
                koniec = j;
            }
            else
                {
                    koniec = -1;
                }
            }
        }
    return koniec;
    }



int main()
{
    char w1[] = "Dominik";
    char w2[] = "zcki";
    int wynik;
    wynik = any(w1, w2);
    printf("%d", wynik);
    return 0;

}
#包括
#包括
int any(字符s1[],字符s2[]{
int i,j;
int koniec;
对于(i=0;s2[i]!='\0';i++){
对于(j=0;s1[j]!='\0';j++){
if(s1[j]==s2[i]){
koniec=j;
}
其他的
{
koniec=-1;
}
}
}
返回koniec;
}
int main()
{
字符w1[]=“多米尼克”;
字符w2[]=“zcki”;
int wynik;
wynik=任何(w1,w2);
printf(“%d”,wynik);
返回0;
}
但它返回:-1 但是应该是3
有什么问题吗?

只要
找到位置时返回它,不要继续循环:

int any(char s1[], char s2[]) {
    int i, j;
    for (i = 0; s1[i] != '\0'; i++) {
        for (j = 0; s2[j] != '\0'; j++) {
            if (s1[i] == s2[j]) {
                return j;
            }
        }
    }
    return -1;
}

只要
在找到位置时返回该位置,不要继续循环:

int any(char s1[], char s2[]) {
    int i, j;
    for (i = 0; s1[i] != '\0'; i++) {
        for (j = 0; s2[j] != '\0'; j++) {
            if (s1[i] == s2[j]) {
                return j;
            }
        }
    }
    return -1;
}

内部循环中的if语句

        if (s1[j] == s2[i]) {
            koniec = j;
        }
        else
            {
                koniec = -1;
            }
没有意义,因为变量
koniec
的值将在两个循环的最后一次迭代中被覆盖

此外,由于循环的顺序,实际上您正在搜索字符串
s1
中字符串
s2
中的一个字符,而您需要在s1中查找s2中存在的第一个字符

该函数可以如下所示,如下面的演示程序所示

#include <stdio.h>
#include <stddef.h>

ptrdiff_t any( const char *s1, const char *s2 )
{
    ptrdiff_t pos = -1;
    
    for ( const char *p1 = s1; pos == -1 && *p1; ++p1 )
    {
        const char *p2 = s2;
        while ( *p2 && *p2 != *p1 ) ++ p2;
        
        if ( *p2 ) pos = p1 - s1;
    }
    
    return pos;
}

int main(void) 
{
    char w1[] = "Dominik";
    char w2[] = "zcki"; 
    
    printf( "%td\n", any( w1, w2 ) );
    
    return 0;
}

实际上,出现在
w2
中的
w1
中的第一个字符是
'i'
。注意位置从0开始。

内部循环中的if语句

        if (s1[j] == s2[i]) {
            koniec = j;
        }
        else
            {
                koniec = -1;
            }
#include <stdio.h>
#include <stdlib.h>

int any(char *s1, char *s2)
{
  int koniec=0;
  int j=0;
  for (int i = 0; s1[i]!='\0'; i++)
  {j=0;
      while(s1[i]!=s2[j]&&s2[j]!='\0')
      {
            j++;

      }
      if(s2[j]!='\0')
      {
          return j;
      }
  }
  return -1;
}


int main()
{
   char w1[] = "Dominik";
   char w2[] = "zcki";
   printf("%d\n", any(w1, w2));
   return 0;
}
没有意义,因为变量
koniec
的值将在两个循环的最后一次迭代中被覆盖

此外,由于循环的顺序,实际上您正在搜索字符串
s1
中字符串
s2
中的一个字符,而您需要在s1中查找s2中存在的第一个字符

该函数可以如下所示,如下面的演示程序所示

#include <stdio.h>
#include <stddef.h>

ptrdiff_t any( const char *s1, const char *s2 )
{
    ptrdiff_t pos = -1;
    
    for ( const char *p1 = s1; pos == -1 && *p1; ++p1 )
    {
        const char *p2 = s2;
        while ( *p2 && *p2 != *p1 ) ++ p2;
        
        if ( *p2 ) pos = p1 - s1;
    }
    
    return pos;
}

int main(void) 
{
    char w1[] = "Dominik";
    char w2[] = "zcki"; 
    
    printf( "%td\n", any( w1, w2 ) );
    
    return 0;
}
实际上,出现在
w2
中的
w1
中的第一个字符是
'i'
。注意位置从0开始。

#包括
#include <stdio.h>
#include <stdlib.h>

int any(char *s1, char *s2)
{
  int koniec=0;
  int j=0;
  for (int i = 0; s1[i]!='\0'; i++)
  {j=0;
      while(s1[i]!=s2[j]&&s2[j]!='\0')
      {
            j++;

      }
      if(s2[j]!='\0')
      {
          return j;
      }
  }
  return -1;
}


int main()
{
   char w1[] = "Dominik";
   char w2[] = "zcki";
   printf("%d\n", any(w1, w2));
   return 0;
}
#包括 int any(字符*s1,字符*s2) { int-koniec=0; int j=0; 对于(int i=0;s1[i]!='\0';i++) {j=0; 而(s1[i]!=s2[j]&&s2[j]!='\0') { j++; } 如果(s2[j]!='\0') { 返回j; } } 返回-1; } int main() { 字符w1[]=“多米尼克”; 字符w2[]=“zcki”; printf(“%d\n”,任何(w1,w2)); 返回0; }
#包括
#包括
int any(字符*s1,字符*s2)
{
int-koniec=0;
int j=0;
对于(int i=0;s1[i]!='\0';i++)
{j=0;
而(s1[i]!=s2[j]&&s2[j]!='\0')
{
j++;
}
如果(s2[j]!='\0')
{
返回j;
}
}
返回-1;
}
int main()
{
字符w1[]=“多米尼克”;
字符w2[]=“zcki”;
printf(“%d\n”,任何(w1,w2));
返回0;
}

别管它了,它足够放:break;在koniec=jOnce之后,找到匹配项,需要返回位置。但是你继续写下去,覆盖了koniec
man-strchr
…没关系,这就足够了:break;在koniec=jOnce之后,找到匹配项,需要返回位置。但是你继续写下去,覆盖了koniec
man strchr
。。。