在字符串中搜索字符串(字符串由用户输入)

时间:2014-01-04 03:51:16

标签: c string

我需要编写一个程序,其中两个字符串通过键盘输入,第一个字符串搜索第二个字符串,然后是第一个出现的点。

#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

我不知道为什么它会在第二次发出序列时发出两次,如果它出现三次就会发出一个大的负数。

我做错了什么?

3 个答案:

答案 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”查看in1in2

的值

答案 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是无效的偏移量。因此您必须处理此问题。