簡體   English   中英

實現一個 function ,它將一個字符串作為輸入並返回一個沒有用“!”替換的輔音字母的新字符串

[英]Implement a function which takes a string as an input and returns a new one without consonant letters replaced with “!”

UPD:我重寫了 function,添加了一個額外的數組來寫入新變量。 但是很可惜,function 現在不工作,文字也不清楚。 而且我不明白出了什么問題我的代碼:

bool IsConsonant(char ch)
{
    const char* consonant = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
    for (size_t c = 0; consonant[c] != '\0'; ++c)
        if (ch == consonant[c])
            return true;
    return false;
}

char* ReplaceConsonant(char* str)
{
    size_t size = strlen(str);
    char* ch = new char[size + 1];
    for (size_t index = 0; str[index] != '\0'; ++index)
    {
        str[index] = ch[index];
        if (IsConsonant(ch[index]))
            ch[index] = '!';
    }
    return ch;
    delete[] ch;
}


int main()
{
    const char* ch = "I like this";
    const char* rez = ReplacedConsonant(ch);
    std::cout << rez;
}

長話短說,ReplacedConsonant(char* str) 的參數 str 的類型是 char*,它是指向 char 的指針,並且您嘗試將變量 ch 作為參數傳遞,而 ch 的類型是 const char*,它是指向 const char 的指針。 因此,您基本上是在嘗試將 const 轉換為非 const var,這是編譯時錯誤。 無論如何,更改字符串文字是未定義的行為,因為字符串文字很可能放置在 memory 的只讀部分中,我認為修改只讀部分是無稽之談。

這應該工作

int main() {
    char ch[] = "I like this";
    const char* rez = ReplacedConsonant(ch);
    std::cout << rez;
    return 0;
}

您當前嘗試修改常量字符串,將調用代碼更改為:

int main()
{
    char ch[] = "I like this";
    const char* rez = ReplacedConsonant(ch);
    std::cout << rez;
}

function 參數的聲明(沒有限定符const

char* ReplacedConsonant(char* str);

表示傳遞給 function 的字符串將被更改。

因此,您可能不會將常量字符串傳遞給 function。

因此,在 main 中聲明一個非常量數組而不是指向字符串文字的指針。 例如

int main()
{
    char ch[] = "I like this";
    std::cout << ReplacedConsonant(ch) << '\n';
}

此外,通常最好通過以下方式聲明 function

char * ReplacedConsonant( char *str, char c = '!' );

在這種情況下,您可以將輔音字母替換為任何字符。 function正文內寫

if ( IsConsonant( str[index] ) ) str[index] = c;

const char *ch; 聲明一個不可變的 c 樣式字符串。 您不能將其傳遞給將char* (可修改字符串)作為參數的 function。 由於這個問題被標記為 c++,我建議你使用std::string和其他一些 c++ 函數來讓你的生活更輕松。

std::string ReplacedConsonant(std::string str)
{
    std::replace_if(str.begin(), str.end(), IsConsonant, '!');

    return str;
}

int main()
{
    std::string ch = "I like this";
    std::string res = ReplacedConsonant(ch);

    std::cout << res;
}

這也滿足了您的問題的標題,即此 function 返回一個新字符串而不是修改現有字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM