繁体   English   中英

为什么 cout 不给字符串 output ?

[英]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。
  • 如果参数不能表示为 unsigned char,则行为未定义。
  • char 可能是有符号类型,因此它的值不一定可以表示为无符号字符。 传递这样的 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 += '.';

尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM