为什么 cout 没有给出字符串的输出?

时间:2021-05-23 21:06:34

标签: c++

我的代码没有在输出中给出 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;
}

3 个答案:

答案 0 :(得分:2)

st[j++]=... 写入超出为字符串分配的空间的末尾并且是未定义的行为。它还会覆盖字符串的终止 nul 字符。

相反,你想要:

st.push_back (...);

或:

st += ...;

答案 1 :(得分:2)

<块引用>
transform(s.begin(),s.end(),s.begin(),::tolower);

这实际上是错误的。 ::tolower 看似难以使用。问题是:

  • ::tolower 的参数是 int。
  • 如果参数不能表示为无符号字符,则行为未定义。
  • char 可能是有符号类型,因此它的值不一定可以表示为无符号字符。传递这样的字符值会导致未定义的行为。

解决方案是在传入::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]);
        }
    }
相关问题