strstr仅在我的子字符串位于字符串末尾时才起作用

时间:2015-12-02 17:15:07

标签: c strstr

我现在在编写的程序中遇到了一些问题。

  1. strstr仅在我的字符串enter image description here的末尾输出我的子字符串
  2. 它还会在enter image description here
  3. 之后输出一些垃圾字符
  4. 我遇到了“const char * haystack”的问题,然后添加了输入,所以我用fgets和getchar循环做了
  5. 在它使用子串的方式的某个地方,不仅在最后,但我输出了子串和其余的字符串
  6. 这是我的主要内容:

    int main() {
        char    haystack[250],
                needle[20];
    
        int     currentCharacter,
                i=0;
    
        fgets(needle,sizeof(needle),stdin); //getting my substring here (needle)
    
        while((currentCharacter=getchar())!=EOF) //getting my string here (haystack)
    
        {
            haystack[i]=currentCharacter;
            i++;
        }
    
        wordInString(haystack,needle);
    
        return(0);
    }
    

    和我的职能:

    int wordInString(const char *str, const char * wd)
    {
        char *ret;
        ret = strstr(str,wd);
    
        printf("The substring is: %s\n", ret);
        return 0;
    }
    

1 个答案:

答案 0 :(得分:2)

您使用fgets()读取一个字符串,使用getchar()读取另一个字符串到文件末尾。在两个字符串的末尾都有一个尾随'\n',因此strstr()只能匹配子字符串,如果它位于主字符串的末尾。 此外,您不会在'\0'的末尾存储最终haystack。您必须执行此操作,因为haystack是本地数组(自动存储),因此不会隐式初始化。

您可以通过这种方式解决问题:

//getting my substring here (needle)
if (!fgets(needle, sizeof(needle), stdin)) {
    // unexpected EOF, exit
    exit(1);
}
needle[strcspn(needle, "\n")] = '\0';

//getting my string here (haystack)
if (!fgets(haystack, sizeof(haystack), stdin)) {
    // unexpected EOF, exit
    exit(1);
}
haystack[strcspn(haystack, "\n")] = '\0';