我试图使子字符串的长度恰好是原始字符串长度的一半,然后按其ASCII码的顺序对其进行排序,最后使用strcmp()库函数检查其相等性。 (那是我试图检查是否可以将父字符串分为两个相等的部分。) 所以这就是我所做的:
通过cin从用户那里获取父字符串的输入。
然后我使用变量hlength来存储原始字符串长度的一半的值。
现在,我声明了两个长度相等的字符串(等于hlength),以便将字符串的前半部分复制到名为“ s1”的子字符串中,将后半部分复制到子字符串“ s2”。我用于循环以复制字符串的元素。
要检查字符串是否正确复制,我使用 cout <<< / 在复制字符串后立即打印了字符串的每个元素,如您所见随附的代码。
到目前为止,由于打印时各个元素的正确性,一切似乎都还不错。
但是!!这是我从未遇到过的情况:当我尝试使用 cout <<< / em> 打印完整的字符串时 输出为空白。
稍后而不是打印字符串,我只是尝试将它们与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:原始字符串的长度是偶数。
请帮助我了解为什么未打印字符串但正确打印单个元素的原因。 这个错误是什么意思?
答案 0 :(得分:0)
strcmp
需要char指针-这就是您的错误消息告诉您的内容。
您可以使用string::compare
或运算符==
,而不会出现此错误。看到:
Stackexchange Topic和cppreference。
为了完整起见,您还可以使用字符串的std::string
方法将c_str()
转换为char指针,但这有点丑陋。
您看到了真实的价值,但是却遇到了不确定的行为。 s1
和s2
的长度为零。运算符[pos]
的定义:
如果pos小于字符串长度,则该函数永远不会抛出异常(无抛出保证)。
如果pos等于字符串长度,则const版本不会抛出异常(无抛出保证)。
否则,它将导致未定义的行为。
最后一点就是您的经验-也许您写入了不属于字符串的一部分内存,但是仍然可以在同一作用域中访问它。但是,当您尝试退出字符串时,字符串存储块中没有写入任何内容。但是谁知道,它的不确定行为,任何事情都会发生。
第异常安全部分:
http://www.cplusplus.com/reference/string/string/operator[]/