我的代码没有在输出中给出 st
。没有编译错误,但也没有输出。
#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;
}
答案 0 :(得分:2)
st[j++]=...
写入超出为字符串分配的空间的末尾并且是未定义的行为。它还会覆盖字符串的终止 nul 字符。
相反,你想要:
st.push_back (...);
或:
st += ...;
答案 1 :(得分:2)
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 += '.';
答案 2 :(得分:0)
尝试使用 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]);
}
}