C 如果没有strstr函数,如何更改此代码以使其工作?

C 如果没有strstr函数,如何更改此代码以使其工作?,c,pointers,C,Pointers,我试图找到文本文件中每一行都有一个特定的字符,并在不使用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

我试图找到文本文件中每一行都有一个特定的字符,并在不使用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;
}
既然您包含了,您就隐式地允许自己使用,即使这是被禁止的,您的程序中的输入或输出将如何发生

一定要了解一些有关函数的信息。阅读您正在使用的每个函数的文档。稍后,还要检查C11标准

在Linux上,getline在中声明,但不是标准IO函数。它在POSIX中。这在使用man getline命令获得的手册页面中有记录

因此,您可以,也可能应该,使用fopen和fg等函数。在Linux上,也可以查看他们的手册页,例如,它提醒您,它在C99中是标准化的

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

char mylinebuf[128];
记录您只接受小于128字节的行,并使用

char* res = fgets(mylinebuf, sizeof(mylinebuf), fp);
不要忘记测试标准IO功能的故障。特别是,fopen失败,fgets也可能失败

一种更聪明的方法可能会模仿getline所做的工作,因此可能只需要编写自己的mygetline函数

如果您被禁止使用strstrstr,您可以编写自己的mystrstrstr函数,如果您被允许使用它,您也可以使用它,否则您可以自己编写代码。这是指针的基本功能

把你的mystrstr写在strchr上面,留给读者作为练习。还可以使用基本指针操作编写mystrchr

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

也请阅读。所以在Linux上学习和。避免-UB-并且您的程序具有多个参数,例如,在没有附加参数的情况下调用时。比如说

     printf("error\n %d", fp);
是错误的,UB和编译器会用gcc-Wall-Wextra-g警告您

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


顺便说一句,在2019年,在实践中,这可能会给你的程序增加复杂性,如果你想认真一点,你可能想在允许的情况下使用,或者写你的mystrstr来了解,并检查你的输入文件内容或程序参数是否有效UTF-8;如果没有库函数,情况可能不是这样。

?如果不调用库函数,几乎不可能打开文件或从中读取数据。您允许使用哪些库函数?@安德烈特勒,您认为系统调用是库函数吗?因为使用open/read/close读取文件很简单。您对函数:strstr和函数:getline有什么意见?我们不应该自己做作业。向我们展示您的尝试。建议实现一个状态机并使用fgetc输入文件内容。从ASCII到UTF-8的更改在哪里记录?对于仍然使用ASCII的旧代码呢?这种更改没有文档记录,并且ASCII不在C11标准中;您可以使用EBCDIC在IBM大型机上用C编写代码,但UTF-8在2019年已成为普遍做法。