不明白为什么 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()
函数将不知道字符串在哪里终止并将访问超出绑定的内存,从而导致未定义的行为。
我正在尝试编写 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()
函数将不知道字符串在哪里终止并将访问超出绑定的内存,从而导致未定义的行为。