繁体   English   中英

字符串未正确复制并显示错误:无法转换 'std::__cxx11::string {aka std::__cxx11::basic_string<char> }'</char>

[英]string not copying correctly and showing error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}'

我试图使子字符串的长度恰好是原始字符串的一半,然后按它们的 ASCII 码顺序对它们进行排序,最后使用 strcmp() 库 function 检查它们的相等性。 (也就是说,我试图检查父字符串是否可以分成相等的两半。)所以这就是我所做的:

  1. 通过 cin 从用户那里输入父字符串。

  2. 然后我使用变量 hlength 来存储原始字符串长度的一半的值。

  3. 现在我声明了两个长度相等的字符串(等于 hlength ),以便将字符串的前半部分复制到名为“s1”的 substring 并将 rest 的一半复制到 substring “s2”。 我使用 for 循环来复制字符串的元素。

  4. 为了检查字符串是否被正确复制,我在使用cout<<复制字符串后打印了字符串的每个元素,正如您在附加代码中看到的那样。

  5. 直到现在一切似乎都很好,因为打印时各个元素都是正确的。

  6. 但:! 这是我以前从未遇到过的情况:当我尝试使用cout<<打印完整的字符串时,output 是空白的。

  7. 后来我没有打印字符串,而是尝试将它们与 strcmp() function 进行比较,但导致错误: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string}' to 'const char ' for参数 '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或 operator ==您可以使用它们而不会出现此错误。 请参阅: Stackexchange 主题cppreference

为了完整起见,您还可以使用字符串的c_str()方法将std::string转换为 char 指针,但这有点难看。

你看到了真正的价值,但你体验到了不确定的行为。 s1s2初始化为零长度。 运算符[pos]定义:

  • 如果 pos 小于字符串长度,则 function 永远不会抛出异常(无抛出保证)。

  • 如果 pos 等于字符串长度,则 const-version 永远不会抛出异常(无抛出保证)。

  • 否则,它会导致未定义的行为。

    最后一点是您所经历的 - 也许您写入 memory 的一部分,它不属于字符串,但仍然可以在同一个 scope 中访问它。 但是当您尝试计算字符串时,字符串 memory 块中没有写入任何内容。 但谁知道,它的未定义行为,任何事情都可能发生。

异常安全

http://www.cplusplus.com/reference/string/string/operator[]/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM