![](/img/trans.png)
[英]Getting "error: cannot convert 'std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}' to 'const char*' error while passing a path as argument
[英]string not copying correctly and showing error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}'
我试图使子字符串的长度恰好是原始字符串的一半,然后按它们的 ASCII 码顺序对它们进行排序,最后使用 strcmp() 库 function 检查它们的相等性。 (也就是说,我试图检查父字符串是否可以分成相等的两半。)所以这就是我所做的:
通过 cin 从用户那里输入父字符串。
然后我使用变量 hlength 来存储原始字符串长度的一半的值。
现在我声明了两个长度相等的字符串(等于 hlength ),以便将字符串的前半部分复制到名为“s1”的 substring 并将 rest 的一半复制到 substring “s2”。 我使用 for 循环来复制字符串的元素。
为了检查字符串是否被正确复制,我在使用cout<<复制字符串后打印了字符串的每个元素,正如您在附加代码中看到的那样。
直到现在一切似乎都很好,因为打印时各个元素都是正确的。
但:! 这是我以前从未遇到过的情况:当我尝试使用cout<<打印完整的字符串时,output 是空白的。
后来我没有打印字符串,而是尝试将它们与 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 指针,但这有点难看。
你看到了真正的价值,但你体验到了不确定的行为。 s1
和s2
初始化为零长度。 运算符[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.