简体   繁体   中英

strstr works only if my substring is at the end of string

I've encountered a couple of problems with the program that i'm writing now.

  1. strstr outputs my substring only if it's at the end of my string 在此处输入图片说明
  2. it also outputs some trash characters after that 在此处输入图片说明
  3. I've had problems with "const char *haystack" and then adding input to it, so i did it with fgets and getchar loop
  4. somewhere along the way it worked with a substring that was not only at the end, but then i outputted substring and the rest of the string ater that

here is my main:

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);
}

and my function:

int wordInString(const char *str, const char * wd)
{
    char *ret;
    ret = strstr(str,wd);

    printf("The substring is: %s\n", ret);
    return 0;
}

You read one string with fgets() and the other with getchar() upto the end of file. There is a trailing '\\n' at the end of both strings, Hence strstr() can only match the substring if it is at the end of the main string. Furthermore, you do not store a final '\\0' at the end of haystack . You must do this because haystack is a local array (automatic storage), and as such is not initialized implicitly.

You can correct the problem this way:

//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';

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM