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