代码在许多地方说“无效的间接”。请帮助。
int main()
{
char *s1,*s2,*position;
printf("Enter string:\n");
gets(s1);
printf("Enter word to find:\n");
gets(s2);
*position=ststr(*s1,*s1);
if(*position)
printf("word is found at %c loc\n",*position);
else
printf("word not found");
getch();
return 0;
}
char *strstr(char *s1,char *s2)
{
int flag=1;
char i,j;
for(i=0; ;i++)
{
if(*s1[i]==*s2[0])
for(j=i;*s2;j++)
{
if(*s1[j]!=*s2[j])
flag=0;
}
}
if(flag)
return i;
else
return 0;
}
答案 0 :(得分:5)
首先,main中的s1
和s2
尚未初始化为指向任何有意义的位置。将它们声明为静态数组,或使用malloc()
或calloc()
在运行时为它们分配内存:
#define SIZE 20 // or some number big enough to hold your input
...
char s1[SIZE], s2[SIZE], *position; // s1 and s2 declared statically
其次,永远不会永远不会使用gets()
; 将在您的程序中引入故障点。请改用fgets()
:
if (fgets(s1, sizeof s1, stdin) != NULL)
// process s1
else
// check for EOF or error on read
修改强>
和其他人一样,你在strstr()
函数中的比较需要
*s1 == *s2
或
s1[i] == s2[i]
但首先你需要处理在main中正确分配你的缓冲区。
答案 1 :(得分:2)
if(*s1[i]==*s2[0])
是我的gcc抱怨的一个例子:
error: invalid type argument of ‘unary *’ (have ‘int’)
如果s1
是指向char
的指针,则s1[i]
是一个字符。因此,您不能再dereference
(使用*
),即s1[i]
不再指向任何内容。
尝试
if(s1[i]==s2[0])
代替。
您还应该更改strstr
的返回值:返回一个整数,您声明返回指向字符的指针。因此,请尝试返回s1+i
。
这里:
for(j=i;*s2;j++)
可能不是你想要的。你没有在循环中的任何地方推进指针s2
,实际上你只是测试每次迭代s2[0]
(与*s2
相同)是否为零。如果s2
不是空字符串,则此循环将永远不会终止。
答案 2 :(得分:1)
if(*s1[j]!=*s2[j])
*s1
表示“s1指向的字符”。s1[j]
表示“*(s1+j)
”或“s1指向后的字符j位置”你必须使用其中一个;不是两个。
答案 3 :(得分:1)
我注意到的一个问题是,只要你做*s1[j]
。星号取消引用数组,[]
表示法也是如此。
s[i]
实际上意味着*(s + i)
,因此您无需再次取消引用它。你拥有它的方式会读**(s + i)
,因为它是一个指针,你不能这样做。
答案 4 :(得分:1)
#include <stdio.h>
char* my_strstr(char *s2, char *s1)
{
int i, j;
int flag = 0;
if ((s2 == NULL || s1 == NULL)) return NULL;
for( i = 0; s2[i] != '\0'; i++)
{
if (s2[i] == s1[0])
{
for (j = i; ; j++)
{
if (s1[j-i] == '\0'){ flag = 1; break;}
if (s2[j] == s1[j-i]) continue;
else break;
}
}
if (flag == 1) break;
}
if (flag) return (s2+i);
else return NULL;
}
int main()
{
char s2[] = "This is the statement";
char s1[] = "the";
char *temp;
temp = my_strstr(s2,s1);
printf("%s\n",temp);
return 0;
}
答案 5 :(得分:0)
#include "stdio.h"
char *strstr(char *str, char *substr)
{
int len = strlen(substr);
char *ref = substr;
while(*str && *ref)
{
if (*str++ == *ref)
{
ref++;
}
if(!*ref)
{
return (str - len);
}
if (len == (ref - substr))
{
ref = substr;
}
}
return NULL;
}
int main(int argc, char *argv[])
{
printf("%s \n", strstr("TEST IS NOT DONE", "IS NOT"));
}