c++ - 字符串未正确复制并显示错误: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}'

标签 c++ arrays string loops error-handling

我试图使Substrings的长度恰好是原始字符串长度的一半,然后按照其ASCII码的顺序对其进行排序,最后使用strcmp()库函数检查其相等性。
(那是我试图检查是否可以将父字符串分为两个相等的部分。)
所以这就是我所做的:

  • 通过cin从用户那里获取父字符串。
  • 然后,我使用变量hlength来存储原始字符串长度一半的值。
  • 现在,我声明了两个长度相等的字符串(等于hlength),以便将字符串的前半部分复制到名为“s1”的子字符串中,将后半部分复制到子字符串“s2”。我使用循环来复制字符串的元素。
  • 要检查字符串是否正确复制,我在复制字符串后立即打印了每个字符串元素,方法是使用 cout << ,如所附代码所示。
  • 到目前为止,由于打印时各个元素的正确性,一切似乎都还不错。
  • 但是!这是我从未遇到过的情况:当我尝试使用 cout << 打印完整的字符串时
    输出为空白。
  • 稍后而不是打印字符串,我只是尝试将它们与strcmp()函数进行比较,但是导致错误:无法将'std::__ cxx11::string {aka std::__ cxx11::basic_string}'转换为'const char'对于参数'1'到'int strcmp(const char *,const char *)'*
  • #include <bits/stdc++.h>
    #define fastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
    #define llt long long int
    using namespace std;
    int main()
    {
        int length,hlength,i,result;
        string s;
        cin>>s;
        length =  s.length();
        hlength = length/2;
        string s1,s2;
        for(i = 0; i< hlength;i++)
        {
            s1[i] = s[i];
            cout<<s1[i]<<endl; //each element gets printed successfully
        }
        for(i = 0; i< hlength ; i++)
        {
            s2[i] = s[length -1 - i];
            cout<<s2[i]<<endl; //the elements are printed successfully, but obviously in the reverse order( order not matters)
        }
        cout<<s1<<endl<<s2; // no strings printed
        sort(s1.begin(),s1.end());
        sort(s2.begin(),s2.end());
    
        result = strcmp(s1 , s2);   //ERROR
        cout<<result<<endl;
    
        return 0;
    }
    
    

    PS:原始字符串的长度是偶数。

    请帮助我知道为什么不打印字符串但正确打印单个元素。
    这个错误是什么意思?

    最佳答案

    strcmp需要char指针-这是您的错误消息告诉您的内容。
    您可以使用string::compare==运算符,而不会出现此错误。看到:
    Stackexchange Topiccppreference
    为了完整起见,您还可以使用字符串的std::string方法将c_str()转换为char指针,但这有点难看。
    您看到了真正的值(value),但是却遇到了不确定的行为。 s1s2的长度为零。运算符[pos]定义:

  • 如果pos小于字符串长度,则该函数从不抛出异常(无抛出保证)。
  • 如果pos等于字符串长度,则const版本不会抛出异常(无抛出保证)。
  • 否则,它将导致未定义的行为。
    最后一点就是您的经验-也许您写入了不属于字符串的一部分内存,但是仍然可以在同一作用域中访问它。但是,当您尝试退出字符串时,字符串存储块中没有写入任何内容。但是谁知道,它的不确定行为,可能会发生任何事情。

  • 区段中的异常安全:
    http://www.cplusplus.com/reference/string/string/operator[]/

    关于c++ - 字符串未正确复制并显示错误: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61270381/

    相关文章:

    C++ FP 树或前缀树

    javascript - 与express js一起使用的synchronize.js

    c++ - 如何将已排序的 std::list of std::pair 转换为 std::map

    c++ - 运行 MEX 文件时 MATLAB 崩溃

    javascript - JS中如何将一维数组转换为列向量

    javascript - 在具有随机起始索引的数组中选择 4 个值

    java 字符串与 mysql 字符串

    c++ - 快速移动 CString 到 std::string

    java - 如何在另一种方法中使用来自一种方法的用户输入字符串?

    c++ - 为什么这个插入给出语法错误