【问题标题】:Converting string in char array in CPP在CPP中转换char数组中的字符串
【发布时间】:2021-12-24 02:47:18
【问题描述】:

我正在做一个项目,我被困了一段时间。 我必须将 char 数组传递给“write”函数。我尝试使用 https://www.techiedelight.com/convert-std-string-char-cpp/ 将“data”curenty 字符串转换为 char 数组,但我只得到错误

error: request for member ‘c_str’ in ‘data’, which is of pointer type ‘const string*’ {aka ‘const std::__cxx11::basic_string<char>*’} (maybe you meant to use ‘->’ ?)
     char* c[] = const_cast<char*>(data.c_str());
void LCD::print(const std::string* data)
{
    for (int i = 0; i < strlen(data); i++)
        write(data[i]);
}

【问题讨论】:

  • std::string::c_str() 是一个东西。它返回一个以 null 结尾的 char*std::string::data() 返回一个非空终止的char*
  • 变量data 是一个指向字符串对象的指针。如果它是单个字符串对象,那么您应该通过 reference 而不是使用指针来传递它。如const std::string&amp; data。否则,您需要先取消对指针的引用,然后才能使用字符串对象(如(*data)[i]data-&gt;length())。
  • 另外strlen 是一个C 空终止字符数组函数,它不适用于std::string(指针或对象)。
  • 总而言之,您可能需要退后一两步,重新了解 C++ 的一些基础知识。
  • @AndreasDM 另一方面,由于 C++11,所有由 std::string 包裹的字符串都必须以空字符结尾,这意味着 data() 必须返回以空字符结尾的字符串。

标签: c++ arrays i2c


【解决方案1】:
const std::string*

std::string 指针传递给函数几乎不是一个好主意。我建议不要做这样的事情。如何更换它取决于您的意图。如果您要传递单个字符串,则对 const 的引用是典型的默认选择。

strlen(data)

strlen 函数不接受 const std::string* 类型的参数。这个程序格式不正确。

如果您想要std::string 的长度,可以使用size 成员函数。

write(data[i]);

在这里,您使用下标运算符访问data 指向的std::string 对象数组中的ith std::string 对象。

strlen 的用法和描述暗示只涉及一个与此数组迭代相矛盾的字符串。


error: request for member ‘c_str’ in ‘data’, which is of pointer type ‘const string*’ {aka ‘const std::__cxx11::basic_string<char>*’}
(maybe you meant to use ‘->’ ?)
     char* c[] = const_cast<char*>(data.c_str());

错误消息解释了您做错了什么。 data 是一个指针。指针没有成员函数。你试图调用不存在的指针的成员函数c_str

错误消息还建议了可能的解决方案。如果您通过指针间接(使用间接成员访问运算符-&gt;)访问指向的字符串,那么您将访问该字符串的c_str 成员函数。 std::string确实有这样的成员函数。

引用的代码中还有另一个错误。您正在尝试使用返回的指针来初始化指针数组c。那是不可能的。只有一个指针返回,在这种情况下创建一个元素的数组没有多大意义。


我必须将一个字符数组传递给“写入”函数

我怀疑你的意思是,你必须传递一个指向空终止字符数组的第一个元素的指针。可以这样做:

std::string data = ...;
write(data.c_str());

它是如此微不足道,我不建议为此目的编写函数。

【讨论】:

    【解决方案2】:

    问题strlen 在您提供const string* 时接受const char*。您可以使用std::stringsize() 成员函数解决此问题,如下所示:

    void print(const std::string* data)
    {
        for (int i = 0; i < (*data).size(); i++)//first we dereference the pointer named data then call the size() member function on pointed string object
            write((*data)[i]); //first we dereference the pointer named data then access the ith element of the pointed string object 
    }
    

    【讨论】:

    • (*data).size() 也可以(并且应该)写成data-&gt;size()。但是,从 C++11 开始,range-based for loop 会更有意义:for (char ch : *data) write(ch);
    • @RemyLebeau 符号data-&gt;(*data). 是等价的。我没有责任写出每一个表达式的每一个等价形式。 Second 使用哪个循环是 OP 的选择。我只更正了 OP 代码 sn-p 的语法和逻辑错误,这样他就不会再遇到最初遇到的编译器错误。
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2021-05-03
    • 2012-10-28
    相关资源
    最近更新 更多