我需要编写一个程序,其中两个字符串通过键盘输入,第一个字符串搜索第二个字符串,然后是第一个出现的点。
#include <stdio.h>
#include <string.h>
int main() {
char in1[10000];
char in2[10000];
fgets(in1, sizeof(in1), stdin);
fgets(in2, sizeof(in2), stdin);
printf("%d", strstr(in1, in2) - in1+1);
return 0;
}
我做了3次测试
in1=11121
in2=121
result=3 correct
in1=11121121
in2=121
result=6 wrong
in1=11121211
in2=121
result=-2348863 obviously wrong
in1=111211211211
in2=121
result=-2348879
我不知道为什么它会在第二次发出序列时发出两次,如果它出现三次就会发出一个大的负数。
我做错了什么?
答案 0 :(得分:3)
在这种情况下,最好使用scanf
,因为它会截断输入中的换行符,而fgets
则不会。此外,您应该使用%ld
,因为您正在使用指针进行操作(或对int
进行强制转换)。
以下代码适用于您的所有示例:
#include <stdio.h>
#include <string.h>
int main()
{
char in1[10000];
char in2[10000];
int i;
scanf("%s", in1);
scanf("%s", in2);
char* result = strstr(in1, in2);
if (result != NULL) printf("%ld\n", strstr(in1, in2) - in1 + 1);
else printf("No match\n");
return 0;
}
答案 1 :(得分:0)
因为功能:char *fgets(char *buf, int bufsize, FILE *stream)
将获得'\n'
;
所以在你的情况下,你的第二次测试是"11121121'\n'\0\"
和"121'\n''0'",
您可以使用“debug”查看in1
和in2
答案 2 :(得分:-1)
问题是,您不会丢弃换行符。因此,您在第一个输入示例中搜索的内容是"121\n"
,这与"11121\n"
的结尾相匹配。 "121\n"
"11121121\n"
的第一场比赛位于第6位。
“11121211\n
”和"121\n"
会发生什么情况:没有匹配且strstr
返回0。
int main() {
char in1[10000];
char in2[10000];
fgets(in1, sizeof(in1), stdin);
{ /* Delete the newline character if there is one. */
size_t len = strlen(in1);
if(in1[len-1]=='\n') in1[len-1] = 0;
}
fgets(in2, sizeof(in2), stdin);
{
size_t len = strlen(in2);
if(in2[len-1]=='\n') in2[len-1] = 0;
}
char *match = strstr(in1, in2);
if(match) {
printf("%td\n", match-in1+1);
// t is the conversion specifier for ptrdiff_t
}
return 0;
}
另外,不要忘记检查fgets
的返回值。另请注意,如果len-1
为0,则len
是无效的偏移量。因此您必须处理此问题。