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

时间:2020-04-17 11:19:36

标签: c++ arrays string loops error-handling

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

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

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

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

  4. 要检查字符串是否正确复制,我使用 cout <<< / 在复制字符串后立即打印了字符串的每个元素,如您所见随附的代码。

  5. 到目前为止,由于打印时各个元素的正确性,一切似乎都还不错。

  6. 但是!!这是我从未遇到过的情况:当我尝试使用 cout <<< / em> 打印完整的字符串时 输出为空白。

  7. 稍后而不是打印字符串,我只是尝试将它们与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:原始字符串的长度是偶数。

请帮助我了解为什么未打印字符串但正确打印单个元素的原因。 这个错误是什么意思?

1 个答案:

答案 0 :(得分:0)

strcmp需要char指针-这就是您的错误消息告诉您的内容。 您可以使用string::compare或运算符==,而不会出现此错误。看到: Stackexchange Topiccppreference

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

您看到了真实的价值,但是却遇到了不确定的行为。 s1s2的长度为零。运算符[pos]的定义:

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

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

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

    最后一点就是您的经验-也许您写入了不属于字符串的一部分内存,但是仍然可以在同一作用域中访问它。但是,当您尝试退出字符串时,字符串存储块中没有写入任何内容。但是谁知道,它的不确定行为,任何事情都会发生。

异常安全部分:

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