任务是在string1
的末尾(即string2
的开头)找到最长的子字符串。
例如,如果string1
是“ monitor”,而string2
是“ orange”,则输出必须是“ or”。
例如,如果string1
是“ bridge”而string2
是“ gear”,则输出必须是“ ge”。
不幸的是,我的代码给出了“ bridge” /“ gear”示例的答案为“ rge”。请帮助我找到此代码中的错误。
#include <stdio.h>
#include <string.h>
void main()
{
char a[80],b[80];
int i,j,t;
scanf("%s",a);//input s1 example bridge
scanf("%s",b);//input s2 example gear
for(i=0;a[i]!='\0';i++)//traversing through first string
{
for(j=i-1;j>=0;j--)
if(a[i]==a[j])
break;
if(j==-1)
for(t=0;b[t]!='\0';t++)
if(a[i]==b[t])
{
printf("%c",a[i]); //output must be ge but this code gives me the output as rge
break;
}
}
}
答案 0 :(得分:1)
我建议您使用strncmp()
函数比较字符串。它确实简化了任务。以下是代码,该代码简短,易读且易于理解:
#include<stdio.h>
#include<string.h>
void main()
{
char a[80],b[80];
char* pa;
scanf("%s",a); //input s1 example bridge
scanf("%s",b); //input s2 example gear
// Iterate over "end substrings" of s1 (from the longest to the shortest)
for (pa = a; *pa != '\0'; pa++)
{
// Compare with "start substring" of s2
if (strncmp(pa, b, strlen(pa)) == 0)
// Here it matches: exit from loop !
break;
}
// Display the result
if (strlen(pa) == 0)
{
printf("Nothing found\n");
}
else
{
printf("Found: %s\n", pa);
}
}
我可能还会建议您采取以下非常短的方法:
void main()
{
char a[80],b[80];
char* pa = a;
scanf("%s",a); //input s1 example bridge
scanf("%s",b); //input s2 example gear
while (strncmp(pa, b, strlen(pa)) && (*(++pa) != '\0'));
printf("%s", strlen(pa) == 0 ? "Nothing found" : pa);
}
答案 1 :(得分:0)
我想我明白了。
#include<stdio.h>
#include<string.h>
void main() {
char a[80],b[80];
int i,j,t;
scanf("%s",a);//input s1 example bridge
scanf("%s",b);//input s2 example gear
int k=0; //start with the first caracther
int memo=0;
for(int i=0;i<strlen(a);i++) {
if(a[i] == b[k]) {
k++; //increase
if(memo == 0) {
memo = i; //save the start
}
}
// reset the compar
else {
k = 0;
i = memo + 1;
memo = 0;
}
}
//if end with memo
if(memo != 0) {
for(int i=memo;i<strlen(a);i++) {
printf("%c",a[i]);
}
}
}