【问题标题】:How to find small string in big string in C?如何在C中的大字符串中找到小字符串?
【发布时间】:2019-03-20 09:02:05
【问题描述】:

尝试在 C 中创建代码。首先,我不能使用 string.h 库或任何其他类似的库。输入将来自命令行,如:./program 模式文件,我已经成功打开文件并将文件的行写入数组,但现在我必须将模式 a get 与文件中的行进行比较。如果有写模式,我必须打印整行。

对于我使用的输入:

char array[1000]; // hope 1000 will be enough

char *pattern= argv[1];

对于我使用的扫描:

while (fscanf(f,"%c", &temp)!= EOF){
        if (temp=='\n'){
             Algoritm...
        }
        add to array( array[i++]=temp) - already works`

如果我得到行尾,我不会当'\n'出现时,我需要启动算法来确定小字符串是否在行中。

我的问题:

如何比较这些“字符串”?有效率的?

如何知道我作为输入得到的图案的大小? (我想我需要那个来做算法)

【问题讨论】:

  • 扫描%c也效率不高,使用fgetc
  • 至于“我不能使用<string.h>”...你知道你可以使用什么功能如果你可以使用它,即strstr,然后谷歌搜索 "strstr c implementation site:stackoverflow.com"
  • 如果您知道可以使用哪个函数,那么使用它的名称就可以很容易地找到有关如何使用它的教程和示例。例如搜索strstr c examplestrstr c tutorial
  • 我猜,您并不真正了解建议的内容。如果您搜索给定函数的实现,您可以将该函数的您自己的版本添加到您的项目中。不涉及图书馆。

标签: c arrays char


【解决方案1】:

我想你是在 linux 上工作。

对于您的第一个问题。 memmem() 应该在你的大海捞针中找到针;

来自 memmem() 手册页:

memmem() 函数查找第一次出现的开始 内存区域干草堆中长度为 needlelen 的子串针 长度干草堆。

memmem 返回:

memmem() 函数返回一个指向开头的指针 子字符串,如果未找到子字符串,则为 NULL。

http://man7.org/linux/man-pages/man3/memmem.3.html

关于你的第二个问题: How to find the length of argv[] in C

【讨论】:

  • 这不是答案。问题说明 “我不能使用 string.h 库或任何其他类似的帮助。”您的第二部分将读者引导到另一个问题,这里没有提出实际的解决方案。
【解决方案2】:

您可以编写自己的查找函数。

int find(char *array, char *pattern) {
    char *ap, *aap, *pp;
    for(ap=array; *ap; ap++) {
        for(pp=pattern, aap=ap; *aap && *pp && *pp==*aap; aap++, pp++); 
        if(*pp=='\0') return ap-array;
    }
    return -1;
}

外部循环在您的第 1 行 char 循环上循环。它是内部循环中比较的起点。内循环在您的模式和行上循环,而

  • 模式未结束
  • 行不在末尾​​li>
  • 模式字符等于行字符

没有循环体。

如果模式结束,它被找到并且函数返回在该行中找到的位置。

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2021-06-11
    • 2013-01-11
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多