簡體   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