#include <stdio.h>
int main()
{
int i,j,k;
char a[10];
char b[5];
char *p_a = a;
char *p_b = b;
printf("enter s strings:\n");
gets(a);
printf("enter search chars: \n");
gets(b);
for(i=0;i<strlen(a);){
for(j=0;j<strlen(b);){
if(a[i] == b[j]){
i++;
j++;
if(j == strlen(b)){
puts(p_a + i -j);
break;
}
}
else{
i = i + 1 -j; //母串自动往后挪一位
j=0;
}
}
}
if((i== strlen(a)) && (j != strlen(b))){
printf("no %s in %s\n",b,a);
}
}
程序编译运行后,会出现错误,输入的b串会被重复打印出来。
经调试分析后发现错误在条件语句的 j=0 处。这里j = 0 导致内部循环死掉,访问数组(数据段)越界后,程序自动停止。
因为编译程序后开辟的空间中,数组a,b连续,所以i超过10后,再自增会访问到b数组地址等b数组访问完,自然 b = b,所以会重复打印b串。
注意点:数组越界;数据区的存放方式。正确代码如下啊:
#include <stdio.h>
int main()
{
int i,j,k;
char a[10];
char b[5];
char *p_a = a;
char *p_b = b;
printf("enter s strings:\n");
gets(a);
printf("enter search chars: \n");
gets(b);
for(i=0;i<strlen(a);){
for(j=0;j<strlen(b);){
if(a[i] == b[j]){
i++;
j++;
if(j == strlen(b)){
puts(p_a + i -j);
break;
}
}
else{
i = i + 1 -j; //母串自动往后挪一位
break;
}
}
if(j == strlen(b))
break;
}
if((i== strlen(a)) && (j != strlen(b))){
printf("no %s in %s\n",b,a);
}
}