[英]Why cout is not giving output for string?
我的代码在 output 中没有给出st
。 没有编译错误,但也没有 output 。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin>>s;
string st;
int j=0;
transform(s.begin(),s.end(),s.begin(),::tolower);
for(int i=0;i<s.size();i++) {
if(s[i]!='a' && s[i]!='e' && s[i]!='o' && s[i]!='u' &&s[i]!='i') {
st[j++]='.';
st[j++]=s[i];
}
}
cout<<st<<endl;
}
st[j++]=...
写入超出为字符串分配的空间的末尾并且是未定义的行为。 它还会覆盖字符串的终止 nul 字符。
相反,你想要:
st.push_back (...);
或者:
st +=...;
transform(s.begin(),s.end(),s.begin(),::tolower);
这实际上是错误的。 ::tolower
看似难以使用。 问题是:
::tolower
的参数是 int。 解决方案是在传递到::tolower
之前将 char 类型的字符转换为 unsigned char 。 例子:
std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c) {
return ::tolower(c);
);
请注意::tolower
一次处理一个代码单元,因此无法正确处理可变宽度字符编码,例如 Unicode。
另一个更明显的错误是:
string st;
那是一个空字符串。
st[j++]='.';
在这里,您可以访问其范围之外的空字符串。 程序的行为是未定义的。
一个解决方案是改为使用:
st += '.';
尝试使用st.push_back()
处理可能发生越界错误的事情,例如字符串和向量。 这样您就不需要声明数组的大小并且可以轻松地添加元素。 做类似的事情
string s ="wpfk"; // Taken anything, you can take by cin too.
string st;
和
for(int i=0;i<s.size();i++)
{
if(s[i]!='a' && s[i]!='e' && s[i]!='o' && s[i]!='u' &&s[i]!='i')
{
st.push_back('.');
st.push_back(s[i]);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.