C:打印最长公共前缀

C: print the longest common prefix

这里是初学者,正在尝试弄清楚如何在 C 中查找和打印最长的公共前缀。

我这里有这个项目的基地。

#include <stdio.h>

void findprefix(char *str1, char *str2, char *found);

int main(void) {
    char str1[100];
    char str2[100];
    char found[10] = { '[=10=]' }; 
    
    printf("\nGive string 1: ");
    scanf("%99s", str1);
    printf("\nGive string 2: ");
    scanf("%99s", str2);
    
    //Print prefix
    findprefix(str1, str2, found); 
    printf("%s", found);
    
    return 0;
}

//Function to find the longest common prefix
void findprefix(char *str1, char *str2, char *found) {
    
    int i, j;
    
    for () {
        if () {
        }
    }
}

最初的想法是在函数中使用 for 循环和 if 语句,但我不确定如何使用。

你有一个很好的基础,除了你应该定义 prefix 长度为 100 的病理情况。

在函数中,您应该使用从 0 开始的索引 i 进行迭代,比较来自 str1str2 的字符在偏移量 i并在它们不同或其中一个为空字节(值为 0 的 char)时停止,否则将字节复制到 found 数组的相同偏移量 i.

循环后。您将在 found 中停止迭代的偏移量处存储一个空字节。

最后,你会return给来电者。

这是一个例子:

#include <stdio.h>

//Function to extract the longest common prefix
int findprefix(const char *str1, const char *str2, char *found) {
    int i;
    
    for (i = 0; str1[i] == str2[i] && str1[i] != '[=10=]'; i++) {
        found[i] = str1[i];
    }
    found[i] = '[=10=]';
    return i;
}

int main(void) {
    char str1[100];
    char str2[100];
    char prefix[100]; 
    
    printf("\nGive string 1: ");
    if (scanf("%99s", str1) != 1)
        return 1;
    printf("\nGive string 2: ");
    if (scanf("%99s", str2) != 1)
        return 1;
    
    //Print prefix
    findprefix(str1, str2, prefix); 
    printf("%s\n", prefix);
    
    return 0;
}

这个声明

char found[10] = { '[=10=]' }; 

多余,没有意义。

此外,函数 findprefix 应该 return 公共前缀的长度。

该函数应按以下方式声明和定义

size_t findprefix( const char *str1, const char *str2 )
{
    size_t n = 0;

    for ( ; *str1 && *str1 == *str2; ++str1, ++str2 )
    {
        ++n;
    }

    return n;
}

在主要部分你可以写

size_t n = findprefix( str1, str2 );

if ( n != 0 ) printf( "%.*s\n", ( int )n, str1 );

这是一个演示程序。

#include <stdio.h>

size_t findprefix( const char *str1, const char *str2 )
{
    size_t n = 0;

    for ( ; *str1 && *str1 == *str2; ++str1, ++str2 )
    {
        ++n;
    }

    return n;
}

int main( void ) 
{
    const char *str1 = "Hello Word!";
    const char *str2 = "Hello Kallum Smith";
    
    size_t n = findprefix( str1, str2 );

    if ( n != 0 ) printf( "\"%.*s\"\n", ( int )n, str1 );
    
    return 0;
}

程序输出为

"Hello "

使用函数的 return 值,您还可以动态分配一个数组或声明一个可变长度数组,如果需要,您可以在其中复制前缀。