Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要在C++中找到两个字符串之间的公共前缀_C++_Algorithm_For Loop_Substring_C Strings - Fatal编程技术网

我需要在C++中找到两个字符串之间的公共前缀

我需要在C++中找到两个字符串之间的公共前缀,c++,algorithm,for-loop,substring,c-strings,C++,Algorithm,For Loop,Substring,C Strings,我的strncpy函数不工作,显示cons char类型的参数与char类型的参数兼容 当我在主函数中调用前缀函数时,它说我必须有一个指向函数类型的指针 #include <iostream> #include <string> #include <cstring> using namespace std; void prefix(const char s1[], const char s2[], char prefix[]); int mai

我的strncpy函数不工作,显示cons char类型的参数与char类型的参数兼容 当我在主函数中调用前缀函数时,它说我必须有一个指向函数类型的指针

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

void prefix(const char s1[], const char s2[], char prefix[]);  

    int main()
    {
        char s1[30];
        char s2[30];
        char prefix[30];

        cout << "Enter two sentences to store in two different strings" << endl;
        cin.getline(s1, 30);
        cin.getline(s2, 30);

        prefix(s1, s2, prefix);

    }

    void prefix(const char a[], const char b[], char prefix[]) 
    {
        int size;
        if (strlen(a) < strlen(b))
        {
            size = strlen(a);
        }
        else if (strlen(a) > strlen(b))
        {
            size = strlen(b);
        }
        else
        {
            size = strlen(a);
        }


            for (int i = 0; i < size; i++) 
            {
                if (a[i] != b[i]) 
                {
                    strncpy(a, b, size);
                }
            }
    }

不确定您的确切错误,但可能类似于错误C2064:term不会计算为包含3个参数的函数,或者错误:“prefix”不能用作函数

这里的问题是您使用名称前缀声明了一个局部变量,因此它将优先于全局函数前缀。某些类型的变量可能是可调用的,例如函数指针、std::function等

最好的解决方案通常是重命名本地,但如果需要,可以显式告诉它使用全局作用域:::prefixs1,s2,prefix

但是,前缀函数本身也有其他错误,如strncpya,b,size;尝试复制到一个常量字符串,这是不允许的,可能您想复制到前缀字符串,并可能在那里结束循环


但是,对于C++,使用STD::string类型通常也更好。您可以使用std::getlinestd::cin、my_std_string来读取行,并且prefix=my_std_string.substr0,我将是复制字符串部分的一种方法。

不确定您的确切错误,但这可能类似于错误C2064:term不计算包含3个参数的函数,或者错误:“prefix”不能用作函数

这里的问题是您使用名称前缀声明了一个局部变量,因此它将优先于全局函数前缀。某些类型的变量可能是可调用的,例如函数指针、std::function等

最好的解决方案通常是重命名本地,但如果需要,可以显式告诉它使用全局作用域:::prefixs1,s2,prefix

但是,前缀函数本身也有其他错误,如strncpya,b,size;尝试复制到一个常量字符串,这是不允许的,可能您想复制到前缀字符串,并可能在那里结束循环


但是,对于C++,使用STD::string类型通常也更好。您可以使用std::getlinestd::cin,my_std_string来读取行,prefix=my_std_string.substr0,我将是复制字符串部分的一种方法。

对于初学者,请在main中使用此声明

char prefix[30];
隐藏具有在全局名称空间中声明的相同名称的函数

重命名函数或变量,或者为函数使用限定名

这个环路

        for (int i = 0; i < size; i++) 
        {
            if (a[i] != b[i]) 
            {
                strncpy(a, b, size);
            }
        }
您正试图更改指针a指向的常量数组

还有许多对strlen函数的冗余调用

该函数可以按照下面的演示程序中所示的方式进行声明和定义

#include <iostream>

char * common_prefix( const char s1[], const char s2[], char prefix[] )
{
    char *p = prefix;

    for ( ; *s1 != '\0' && *s1 == *s2; ++s1, ++s2 )
    {
        *p++ = *s1;
    }

    *p = '\0';

    return prefix;
}

int main() 
{
    const size_t N = 30;

    char s1[N];
    char s2[N];
    char prefix[N];

    std::cout << "Enter two sentences to store in two different strings" << '\n';
    std::cin.getline( s1, N );
    std::cin.getline( s2, N );

    std::cout << "The common prefix is \"" << common_prefix( s1, s2, prefix ) 
              << "\"\n";

    return 0;
}

首先,这是一个主要的声明

char prefix[30];
隐藏具有在全局名称空间中声明的相同名称的函数

重命名函数或变量,或者为函数使用限定名

这个环路

        for (int i = 0; i < size; i++) 
        {
            if (a[i] != b[i]) 
            {
                strncpy(a, b, size);
            }
        }
您正试图更改指针a指向的常量数组

还有许多对strlen函数的冗余调用

该函数可以按照下面的演示程序中所示的方式进行声明和定义

#include <iostream>

char * common_prefix( const char s1[], const char s2[], char prefix[] )
{
    char *p = prefix;

    for ( ; *s1 != '\0' && *s1 == *s2; ++s1, ++s2 )
    {
        *p++ = *s1;
    }

    *p = '\0';

    return prefix;
}

int main() 
{
    const size_t N = 30;

    char s1[N];
    char s2[N];
    char prefix[N];

    std::cout << "Enter two sentences to store in two different strings" << '\n';
    std::cin.getline( s1, N );
    std::cin.getline( s2, N );

    std::cout << "The common prefix is \"" << common_prefix( s1, s2, prefix ) 
              << "\"\n";

    return 0;
}

请在问题中包含完整的错误信息。这看起来是错误的,strncpya,b,size;,是否要将i元素复制到前缀?循环是否也应该在该点结束?OT:您可以使用auto size=std::minstrlena,strlenb;如果你在使用C++,那么你为什么要使用C++风格的数组、StruLand和C++中的C StncPy函数呢?我们有更好的选择。首先查看std::string,然后调查标题..请在问题中包含完整的错误消息这看起来是错误的,strncpya,b,size;,是否要将i元素复制到前缀?循环是否也应该在该点结束?OT:您可以使用auto size=std::minstrlena,strlenb;如果你在使用C++,那么你为什么要使用C++风格的数组、StruLand和C++中的C StncPy函数呢?我们有更好的选择。首先查看std::string,然后调查头。。