将字符串作为指针传递时出错,无法将const char *分配给char *

时间:2019-03-13 15:31:38

标签: c++ string pointers char

我正在从教科书中学习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的数组,为什么不允许这样做,什么是合适的替代方法?预先谢谢你。

3 个答案:

答案 0 :(得分:6)

您的书已经过时了,不再符合标准了,因为自C ++ 11起char*的拼写必须是const

const char *get_substr(const char *sub, const char *str);

看看curated C++ book list

答案 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>