我正在尝试编写grep的简化版本。它适用于我头脑中的大部分情况,但当我传递“test”的参数(即shell中的“./grep test”)和std输入
sajktestakjsdjka
jkskjfsdjfktestskjfkjsa
testsjhfhsjk'
sajkdjsatest
我得到了
的stdoutputsajktestakjsdjka
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);
}
答案 0 :(得分:1)
一个原因是您没有在buffer
函数中使用'\0'
终止checknextline()
。
在那个功能中你应该做
while (((c = getchar()) != EOF) && (c != '\n')) {
... //your code
buffer[read] = (unsigned char) c;
read++;
}
buffer[read] = '\0';
如果没有这个,strstr()
函数将不知道字符串终止的位置,并且将访问超出绑定的内存,从而导致未定义的行为。