【问题标题】:Determine if a file contains a string in C确定文件是否包含 C 中的字符串
【发布时间】:2018-12-06 17:04:39
【问题描述】:

如何检查给定的FILE* 是否包含在 Linux 上运行的 C 中的字符串(如果重要)?

字符串必须包含它所在的整行。例如,这个:

jfjfkjj
string
jfjkfjk

会是真的;但是这个:

jffjknf
fklm...string...lflj
jfjkfnj

不会。我本质上是在寻找system("grep -x file")的内部替代方案@

【问题讨论】:

  • 逐行读取并比较。
  • 可以使用getlinestrcmp等函数
  • @lurker 好的,我会阅读他们的手册页。
  • while(fgets( ....) != NULL) 记得remove any trailing newline
  • @WeatherVane 我刚刚看到你的评论,这确实是我刚才想出的代码。我知道这有点离题,但while(fgets( ....) != NULL)while(!fgets( ....)) 有什么区别?

标签: c string file-processing word-processor


【解决方案1】:

这会逐行读取文件,并在每次读取后检查该行是否与参数 1 (argv[1]) 中提供的字符串匹配。如果是这样,它将 bool infile(在 <stdbool.h> 中定义的 bool)设置为 true。

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv[]) {
    char    *filepath = "/path/to/file";
    bool    infile = false;
    char    *line = NULL;
    size_t  len = 0;
    ssize_t read;

    FILE    *fp = fopen(filepath, "r");

    if (!fp) {
        fprintf(stderr, "Failed to open %s\n", filepath);
        return 1;
    }

    while ((read = getline(&line, &len, fp)) != -1) {
        line[strcspn(line, "\n")] = 0;
        if (!strcmp(line, argv[1])) {
            infile = true;
            break;
        }
    }
    fclose(uuidfp);

    if (line)
        free(line);

    return 0;
}

【讨论】:

  • 如果您希望提高性能,您可能希望对目标行进行哈希处理,然后首先将哈希值与文件中的每一行进行比较。在哈希冲突的情况下,您仍然需要执行strcmp(),但冲突应该很少见,除非您期望对抗性输入。
  • @EOF 我不认为这是值得的麻烦。
  • @SteveSummit 我希望这取决于。一个更简单的测试是使用 getline() 的返回值,它必须是 strlen(argv[1])strlen(argv[1])+1 以使字符串可能相等。
  • 一个合理的解决方案,但没有关于文件中是否找到来自argv[1]的字符串的报告。它有一个缺陷,您没有检查argc 以确保提供了argv[1]。此外,main 参数不正确; char **argv[] 应该是 char *argv[]char **argv
  • @EOF 2nd idea 不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2014-01-29
相关资源
最近更新 更多