【问题标题】:C strstr not working correctlyC strstr 无法正常工作
【发布时间】:2016-03-08 08:10:46
【问题描述】:

我正在尝试使用 strstr 使用子字符串搜索任何匹配项并将其与一行文本进行比较,但到目前为止还没有成功获得匹配项。我正在使用 popen 打开和读取文件,同时尝试仅使用 ipv4 地址查找匹配项进行搜索。我的代码有什么问题?任何帮助将不胜感激,谢谢。

char *buffe = malloc(sizeof(char));

        FILE *rib_file = popen("bgpdump -Mv rib.20160101.0000.bz2", "r");
        while(fgets(buffe, sizeof(buffe), rib_file)!=NULL) {
            if(buffe[strlen(buffe)-1] == '\n')
                buffe[strlen(buffe)-1] = '\0';
          for (int i = 0; i < argc; i++) {
            if((strstr(buffe, argv[i])) != NULL) {
                printf("A match found on line: %d\n", line_num);
                printf("\n%s\n", buffe);

                find_result++;
            }
                line_num++;
          }

        }
            if(find_result == 0) {
                printf("\nSorry, couldn't find a match.\n");
            }

        if (rib_file) {
            pclose(rib_file);
        }

        free(buffe);
    }

buffe 的例子:

TABLE_DUMP2|01/01/16 00:00:38|B|202.232.0.3|2497|223.255.254.0/24|2497 7473 3758 55415|IGP

当我的代码找到匹配项时,我正在尝试打印上面的确切行。

【问题讨论】:

  • 我们需要知道buffe 是什么,您期望此代码输出什么,代码输出什么,您输入什么输入等等。跨度>
  • 您没有显示整个代码,但buffe 似乎是一个指向已分配内存的指针,因为您稍后会free 它。这意味着sizeof(buffe) 比您想象的要小:它是指针的大小,而不是分配的字节数。
  • 文件内容是什么,如果是二进制数据strstr是不是用的函数
  • 除此之外,请记住所有字符串函数都区分大小写。
  • 您分配 1 个字节并读取 sizeof(char*) 字节。这导致了 UB。

标签: c popen fgets strstr


【解决方案1】:

sizeof 函数告诉您类型的大小。由于buffe 是一个指针,您对sizeof(buffe) 的调用将使您获得平台上指针的大小,这几乎肯定不是您想要的。你的意思是把fgets 传递给buffe 指向的东西的大小吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2020-08-01
    • 2013-08-26
    • 2010-11-29
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多