我需要在C++中找到两个字符串之间的公共前缀
我的strncpy函数不工作,显示cons char类型的参数与char类型的参数兼容 当我在主函数中调用前缀函数时,它说我必须有一个指向函数类型的指针我需要在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
#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,然后调查头。。