比较 C 中的 2 个字符串并打印相等的部分

标签 c string

如何比较最大长度为 100 的 2 个字符串并打印它们的相等部分,例如:

STRING 1 : ABCDEFGHIJKLMNOP
STRING 2 : QWERABCDZXVBERTY

这些字符串的相等部分是:ABCD

最佳答案

请看看这个程序是否可以帮助您。它将两个字符串作为来自命令行的参数。

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

int *substring(char *s, char *t) {
    int strlen1 = strlen(s);
    int strlen2 = strlen(t);
    int len = strlen1 < strlen2 ? strlen1 : strlen2;
    int i, j, k;
    int longest = 0;
    int **ptr = (int **) malloc(2 * sizeof(int *));
    static int *ret;
    ret = (int *) calloc(strlen1 + 1, sizeof(int));
    for (i = 0; i < 2; i++)
        ptr[i] = (int *) calloc(strlen2, sizeof(int));

    k = 0;
    for (i = 0; i < strlen1; i++) {
        memcpy(ptr[0], ptr[1], strlen2 * sizeof(int));
        for (j = 0; j < strlen2; j++) {
            if (s[i] == t[j]) {
                if (i == 0 || j == 0) {
                    ptr[1][j] = 1;
                } else {
                    ptr[1][j] = ptr[0][j - 1] + 1;
                }
                if (ptr[1][j] > longest) {
                    longest = ptr[1][j];
                    k = 0;
                    ret[k++] = longest;
                }
                if (ptr[1][j] == longest) {
                    ret[k++] = i;
                    ret[k] = -1;
                }
            } else {
                ptr[1][j] = 0;
            }
        }
    }
    for (i = 0; i < 2; i++)
        free(ptr[i]);
    free(ptr);
    ret[0] = longest;
    return ret;
}

int main(int argc, char *argv[]) {
    int i, longest, *ret;

    if (argc != 3) {
        printf("usage: longest-common-substring string1 string2\n");
        exit(1);
    }

    ret = substring(argv[1], argv[2]);
    if ((longest = ret[0]) == 0) {
        printf("There is no common substring\n");
        exit(2);
    }

    i = 0;
    while (ret[++i] != -1) {
        printf("%.*s\n", longest, &argv[1][ret[i] - longest + 1]);
    }

    exit(0);
}

测试

./a.out ABCDEFGHIJKLMNOP QWERABCDZXVBERTY
ABCD

关于比较 C 中的 2 个字符串并打印相等的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091174/

相关文章:

c#CompareTo()方法

php - 如何获取字符串开头的所有数字?

c - 理解 printf 中的符号

Linux vi 中的 C 编程

c++ - 如何使用 gnu 缩进在函数名和括号之间设置空格?

c - 带阴影的快速 'ball' 像素光栅化例程

java - 在Java中,将字符串数组转换为 float 组的最快、最简单的方法是什么?

c - 在 C 中释放一个双向链表

string - objective-c : Insert string into another string at a certain range

java - 提取两个定界符之间的字符串