[英]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.