为什么我会在C++中得到"forbids converting a string constant to ‘char*’"?



我试图手动反转案例,并尝试了以下操作:

char* invertirCase(char* str){
int size = 0;
char* iterador = str;
char* retorno = str;
while (*iterador != '') {
if (retorno[size] < 96) {
retorno[size] = *iterador + 32;
}
else {
retorno[size] = *iterador - 32;
}
iterador++;
size++;
}
return retorno;
}

我试图弄清楚错误在哪里,但我不明白,因为我对C++语言还很陌生。

为什么我得到"禁止将字符串常量转换为"char*";在C++中?

错误消息表示您正试图将字符串文本传递给函数。

C++中的字符串文字具有常量字符数组类型,这些数组通过值传递给函数,并隐式转换为类型const char *。任何更改字符串文字的尝试都会导致未定义的行为。

您可以向函数传递一个由字符串文字初始化的字符数组,例如

char s[] = "Hello";
std::cout << invertirCase( s ) << 'n';

反过来,功能可以通过以下方式定义

#include <cctype>
char * invertirCase( char *str )
{
for ( char *p = str; *p; ++p )
{
unsigned char c = *p;
if ( std::isalpha( c ) )
{
if ( std::islower( c ) )
{
*p = std::toupper( c );
}
else
{
*p = std::tolower( c );
}
}
}
return str;
}

char * invertirCase( char *str )
{
for ( char *p = str; *p; ++p )
{
unsigned char c = *p;
if ( std::islower( c ) )
{
*p = std::toupper( c );
}
else if ( std::isupper( c ) )
{
*p = std::tolower( c );
}
}
return str;
}

没有"字符串常量";在你显示的代码中,所以它必须在呼叫站点,即如果你正在做invertirCase("string")之类的事情,这将不起作用,原因有两个:

  1. 从C++11开始,C++不允许将字符串文本分配给char*指针。这是因为字符串文字是const char[]数组,并且不能有指向常量数据的非常量指针。因此,您需要使用const char*

  2. 然而,这仍然不起作用,因为invertirCase()修改其str参数所指向的数据。不能修改字符串文字的数据。

因此,您必须将字符串文本的副本复制到可写内存中。你可以在呼叫站点复制,例如:

char str[] = "string";
invertirCase(str);

或者,您可以在invertirCase()内部制作副本(但调用方在使用它时必须释放副本(,例如:

char* invertirCase(const char* str){
int size = 0;
char* retorno = new char[strlen(str)+1];
while (*str != '') {
retorno[size] = (*str < 96) ? (*str + 32) : (*str - 32);
str++;
size++;
}
retorno[size] = '';
return retorno;
}
char *str = invertirCase("string");
...
delete[] str;

否则,根本不要使用char*。改为使用std::string,例如:

std::string invertirCase(const std::string &str){
std::string retorno;
retorno.reserve(str.size());
for(char ch : str) {
retorno.push_back((ch < 96) ? (ch + 32) : (ch - 32));
}
return retorno;
}
std::string str = invertirCase("string");
...

相关内容

  • 没有找到相关文章

最新更新