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

时间:2015-06-06 06:39:24

标签: c arrays string pointers strstr

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

sajktestakjsdjka
jkskjfsdjfktestskjfkjsa
testsjhfhsjk'
sajkdjsatest

我得到了

的stdoutput
sajktestakjsdjka
jkskjfsdjfktestskjfkjsa
testsjhfhsjk'
ts
sajkdjsatest

ts

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

我打印到stdout的唯一功能是

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

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

    free(buffer);
}

我猜我的strstr函数实现有问题。我相信它应该只在字符串“test”不在我的缓冲区内时返回null,但显然它在其他情况下也返回null。我认为我得到奇怪的输出行,因为我打印一个指向随机内存的缓冲区,但我不明白为什么strstr函数在这种情况下不返回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);

}

1 个答案:

答案 0 :(得分:1)

一个原因是您没有在buffer函数中使用'\0'终止checknextline()

在那个功能中你应该做

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

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