不明白为什么 strstr 函数返回非 NULL 值

Don't understand why strstr function is returning non-NULL value

我正在尝试编写 grep 的简化版本。它适用于我脑海中的大多数情况,但是当我传递 "test" 的参数(即 shell 中的“./grep test”)和

的标准输入时
sajktestakjsdjka
jkskjfsdjfktestskjfkjsa
testsjhfhsjk'
sajkdjsatest

我得到

的标准输出
sajktestakjsdjka
jkskjfsdjfktestskjfkjsa
testsjhfhsjk'
ts
sajkdjsatest

ts

某些字符似乎是 UTF-8,无法复制到此 post。

我唯一可以打印到标准输出的函数是

static void printnextline(char *buffer, char *str) {

    if (strstr(buffer, str) != NULL) {
        printf("%s\n", buffer);
    }

    free(buffer);
}

我猜我对 strstr 函数的实现有问题。我相信只有当字符串 "test" 不在我的缓冲区内时它才应该 return null,但显然在其他情况下它的 returning null 也是如此。我想我得到了奇怪的输出行,因为我正在打印一个指向随机内存的缓冲区,但我不明白为什么在这种情况下 strstr 函数不是 returning null。

也许这是一个完全不相关的问题,所以这是其余代码

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define BASE_SIZE 5

bool errorexists(int argc) {
    if (argc != 2) {
        fprintf(stderr, "Please enter one and only one argument");
        return true;
    }
    return false;
}

static void printnextline(char *buffer, char *str) {

    if (strstr(buffer, str) != NULL) {
        printf("%s\n", buffer);
    }

    free(buffer);
}


static void checknextline(char *str) {

    char *buffer;
    buffer = malloc(BASE_SIZE * sizeof(char));
    int read = 0;
    int size_count = 1;
    char *backup;

    int c;
    while (((c = getchar()) != EOF) && (c != '\n')) {
        if (read == BASE_SIZE * size_count) {
            size_count++;
            backup = realloc(buffer, BASE_SIZE * size_count * sizeof(char));
            if (backup != NULL) {
                buffer = backup;
            } else {
                fprintf(stderr, "Ran out of memory to store line of characters");
                exit(EXIT_FAILURE);
            }
        }
        buffer[read] = (unsigned char) c;
        read++;
    }
    printnextline(buffer, str);
}


int main(int argc, char *argv[]) {

    if (errorexists(argc) == true) {
        exit(EXIT_FAILURE);
    }

    char *str = argv[1];

    while (!feof(stdin)) {
        checknextline(str);
    }

    exit(EXIT_SUCCESS);

}

一个原因是您没有在 checknextline() 函数中使用 '[=12=]' 终止 buffer

在那个函数中你应该做

while (((c = getchar()) != EOF) && (c != '\n')) {
        ... //your code
        buffer[read] = (unsigned char) c;
        read++;
    }
    buffer[read] = '[=10=]';

如果没有这个,strstr() 函数将不知道字符串在哪里终止并将访问超出绑定的内存,从而导致未定义的行为。