gpt4 book ai didi

c - 我如何更改此代码以在没有 strstr 函数的情况下工作?

转载 作者:行者123 更新时间:2023-11-30 18:45:31 25 4
gpt4 key购买 nike

我试图找到文本文件中具有特定内容的每一行,并在不使用 strstr 或 getline 的情况下对它们进行计数。我怎样才能更改我的代码以使其在没有它的情况下工作?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]){

FILE * fp;
char * s = argv[1];
int lines = 0, i;
fp = fopen("mytext.txt", "r");
if(fp == NULL){
printf("error\n %d", fp);
exit(1);
}
size_t lookfor;
char * lines = NULL;
size_t len = 0;
while ((lookfor = getline(&lines, &len, fp)) != -1) {
if(strstr(lines, s) != NULL) {
lines+= 1;
}
}
fclose(fp);
printf("the number of lines that include the word 'great' are%d\n", lines);
return 0;
}

最佳答案

因为您包括 <stdio.h>您隐式地允许自己使用 standard IO functions (如果连这个都被禁止,那么程序中的输入或输出将如何发生?)。

一定要研究一些C reference关于C standard library功能。 阅读您正在使用的每个函数的文档。稍后,还检查 C11 标准 n1570 .

在 Linux 上,getline <stdio.h> 中声明但不是标准的IO功能。它是在 POSIX 中。这记录在 getline(3) 中手册页(通过man getline命令获得)。

所以你可以,而且你可能应该,使用类似 fopen 的函数和 fgets fgetc 。在 Linux 上,另请参阅他们的手册页,例如 fgets(3) ,这提醒您它已在 C99 中标准化。

一个简单的方法是为您的线路声明一些缓冲区,例如

char mylinebuf[128];

文档,您只接受小于 128 字节的行,并使用

char* res = fgets(mylinebuf, sizeof(mylinebuf), fp);

不要忘记测试标准 IO 功能的故障。特别是fopen could失败并且 fgets也可能失败。

更聪明的方法可能会模仿 getline正在做(所以也许编写你自己的 mygetline 函数),仅使用 fgetc(3) .

如果您被禁止使用strstr你可以自己写mystrstr函数做同样的事情(也许使用 strchr 如果你被允许使用它,否则你自己编码)。这是基本的指针内容。

写下你的mystrstr以上strchr留给读者作为练习。并写下您的 mystrchr使用基本的指针操作。

如果使用 GCC在 Linux 上,始终启用所有警告和调试信息,因此编译 with gcc -Wall -Wextra -g .

另请阅读How to debug small programs 。所以在Linux上学习use the gdb debuggervalgrind 。避免undefined behavior -UB- (并且您的程序有其中几个,例如在没有附加参数的情况下调用时)。例如

     printf("error\n %d", fp);

是错误的并且 UB (编译器会用 gcc -Wall -Wextra -g 警告您)。

您需要改进代码以避免 UB,而这不仅仅是更改代码以避免 strstr .

顺便说一句,2019 年,UTF-8 is used everywhere (在实践中),如果你想认真的话,这可能会增加你的程序的复杂性(如果允许的话,你可能想使用 libunistring ,或者写你的 mystrstr 来了解 UTF-8 ,并且检查您的输入文件内容(或程序参数)是否为有效的 UTF-8;情况可能并非如此。)。

关于c - 我如何更改此代码以在没有 strstr 函数的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com