【问题标题】:error: invalid conversion from ‘const char*’ to ‘char*’ [duplicate]错误:从‘const char*’到‘char*’的无效转换[重复]
【发布时间】:2012-10-13 14:39:28
【问题描述】:

可能重复:
Using strtok with a std::string

#include<iostream>
#include <string>
#include <string.h>

using namespace std;

int main()
{
    string s("hello hi here whola");
    string background;
    char *strval;

    char* tok = strtok_r(s.c_str()," ",&strval);
    while(tok !=NULL)
    {
    cout << tok <<"\n";
    if (tok == "&")
        background = tok;
    else
    {
        statements1;
        statement2.. ;
    }
    tok = strtok_r(NULL, " ",&strval);
    }

    return 0;
}

输出:

new.cpp: In function ‘int main()’:
new.cpp:13:47: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
/usr/include/string.h:359:14: error:   initializing argument 1 of ‘char* strtok_r(char*, const char*, char**)’ [-fpermissive]

【问题讨论】:

  • 你为什么要标记这个C?您是否认为 C 和 C++ 是同一种语言?
  • 这真是太可怕了。先选一门语言,我推荐C++。
  • 为什么当他们是不同的语言时,人们将它标记为c和C++?
  • 因为您不喜欢代码而拒绝此代码是不正确的。这是一个很好的、清晰的问题,有一个简短的、独立的、(几乎)可编译的代码 sn-p。考虑发布答案而不是投反对票。

标签: c++


【解决方案1】:

s.c_str() 返回一个指向 const char 的指针,以防止您修改备份内存。您需要使用strdup() 函数制作此常量字符串的可写副本,因为strtok() 确实修改了您正在扫描令牌的字符串。

【讨论】:

  • 问题在于c++字符串类和C中的char *类型一起使用。
  • @Andrej 我很好奇 C++ 中是否禁止 'char *' 类型:)
  • 当然不是,但是在给定的情况下混合这些类型似乎没有必要,而且有点危险。
  • @Andrej 我同意,但问题听起来是“为什么它会在编译时产生错误”,而不是“请告诉我如何使用其“本机”API 在 C++ 中编写防错代码'
  • 你是对的,但如果某些代码编译它并不自动意味着它是好的并且不会产生和运行时错误。
【解决方案2】:

strtok 修改其参数。 string.c_str() 不允许这样做,因为它是一个 const char*

此外,即使它有效,您的 if( tok == "&amp;" ) 也不会有效,因为 tok 是一个 char*,而不是字符串,因此您将进行指针而不是内容比较。

您需要使用strcmp()

既然你使用的是字符串,为什么不去打破并使用其他 c++ 构造?

stringstream ss(s);
string tmp; 
while (ss >> buf) {
    if( buf == "&" ) background = buf; // one wonders why
    cout << buf << '\n';
}

【讨论】:

    【解决方案3】:

    您的代码将 C++ strings 和 couts 与 C strtok_r 函数混合在一起。这不是一个好的组合。

    您的错误的直接原因是c_str() 返回一个const char *,而strtok() 要求一个非常量char *。它想修改你作为参数传递的字符串,你不能修改c_str()返回的字符串。

    如果您想使用这种 C 风格,请将 s 切换为 char[]

    char s[] = "hello hi here whola";
    int background = 0;
    char *strval;
    
    char* tok = strtok_r(s, " ", &strval);
    while (tok != NULL)
    {
        printf("%s\n", tok);
    
        if (strcmp(tok, "&") == 0)
            background = 1;
        else
        {
            statement1;
            statement2;
            ...
        }
    
        tok = strtok_r(NULL, " ", &strval);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2021-01-30
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多