我正在从教科书中学习C ++(C ++:Beginners指南,第二版,Herbert Schildt)。以下程序代码摘自本书,但结果有误,有人可以向我解释为什么不允许这样做吗?
目的是演示一个指针作为参数:
#include <iostream>
using namespace std;
char *get_substr(char *sub, char *str); //function prototype
int main()
{
char *substr;
substr = get_substr("three", "one two three four");
cout << "substring found: " << substr;
return 0;
}
我不会列出函数体,因为它会如您所愿地运行,但是即使它仅返回零,也会导致以下错误: E0167类型“ const char *”的参数与类型“ char *”的参数不兼容,引用了函数调用。我的理解是,无论如何,字符串基本上是C中char的数组,为什么不允许这样做,什么是合适的替代方法?预先谢谢你。
答案 0 :(得分:6)
您的书已经过时了,不再符合标准了,因为自C ++ 11起char*
的拼写必须是const
:
const char *get_substr(const char *sub, const char *str);
答案 1 :(得分:1)
字符串文字如“三”是const char [N]
数据类型。
传递的参数不符合C ++ 11标准。
以下用法可以解决您的问题
const char *get_substr(const char *sub, const char *str);
这里是您的快速指南 https://www.geeksforgeeks.org/difference-const-char-p-char-const-p-const-char-const-p/
答案 2 :(得分:0)
您的编译器抱怨,因为您正在将字符串文字提供给可能要对其进行修改的函数。
大概,您的get_substr()
函数不会修改输入字符串,也不会修改您要查找的字符串(两个参数)。
如果您知道有关函数的信息,则可以将其原型更改为
const char *get_substr(const char *sub, const char *str);
这具有以下效果:
const
数据(例如文字)作为函数参数时,编译器可以自由地假设您的函数不会更改数据并且不会抱怨。 li>