簡體   English   中英

如何從char數組中正確刪除字符(有或沒有轉換為字符串)?

[英]How to properly remove a character from a char array (with or without converting to a string)?

對於任何可能的重復問題,提前抱歉。 我一直在谷歌搜索我的編譯器錯誤的解決方案,一個星期了,嘗試了不同的解決方法,從這里的各種答案,但我不斷得到一些錯誤。

我目前正在學習C ++,試圖構建一個程序來完成基本的東西,如元音/輔音計數,刪除字母等。一切正常,直到我找到自定義字母刪除部分。 基本上,使用字符函數(根據我的知識)幾乎不可能這樣做,而轉換為字符串似乎會產生其他類型的錯誤。

這是我不斷收到錯誤的代碼片段:

if (strcmp (service, key4) ==0)
{
string str(s);

cout<<endl<<"Please insert the letter you would like removed from your "<<phrasal<<":"<<endl;

cin>>letterToRemove;

s.erase(remove(s.begin(), s.end(),letterToRemove), s.end());

cout<<endl<<s<< "\n"<<endl;
}

這里是我使用的初始化變量:

int main()

{
char s[1000], phrasal[10], service[50], key1[] = "1", key2[] = "2", key3[] = "3", key4[] = "4", key5[] = "5", key6[] = "6", key0[] = "0", *p, letterToRemove;

int vowel=0, vowel2=0, consonant=0, consonant2=0, b, i, j, k, phrase=0, minusOne, letter, idxToDel;

void pop_back();

char *s_bin;

如您所見,原始's'是一個char數組。 在第一個代碼示例中,我嘗試將其轉換為字符串數組( 字符串str(s) ),但這會導致以下編譯錯誤:

  • 錯誤:請求's'中的成員'erase',這是非類型'char [1000]'
  • 錯誤:請求's'中的成員'begin',這是非類型'char [1000]'
  • 錯誤:請求's'中的成員'end',這是非類型'char [1000]'
  • 錯誤:請求's'中的成員'end',這是非類型'char [1000]'

我嘗試過的另一種解決方法是:

if(strcmp(service, key4)==0)

{std::string s(s);

cout<<endl<<"Please insert the letter you would like removed from your "<<phrasal<<":"<<endl;

cin>>letterToRemove;

s.erase(remove(s.begin(), s.end(),letterToRemove), s.end());

cout<<endl<<s<< "\n"<<endl;
}

現在這是有趣的部分,我沒有得到任何錯誤,但是一旦我選擇了自定義字母刪除功能,調試就會崩潰。 這就是它所說的:

“在拋出'std :: length_error'的實例后調用終止what():basic_string :: _ S_create此應用程序已請求運行時以不尋常的方式終止它。請聯系應用程序的支持團隊以獲取更多信息。”

任何幫助將非常感激,堅持這一個一個星期吧!

PS如果我或主持人在回答完問題后刪除了這個問題,這樣可以嗎? 我很確定我不是第一個問這個問題的人,但是,正如之前提到的那樣,即使在回答了類似問題的答案后,我仍然會遇到這些錯誤。

對於char數組,您必須使用std::remove而不是erase ,並手動插入null-terminator:

auto newEnd = std::remove(std::begin(s), std::end(s), letterToRemove);
*newEnd = '\0';

如果你有一個通用數組,可能會或可能沒有衰減到指針,並且你有數組中的元素數但沒有其他終結符(即它不是C風格的零終止字符串),那么這是一個解決方案:

首先,我想讓你想一想數組在內存中的表現。 例如,如果我們有一個字符數組

char array[X] = { 'A', 'B', 'C', 'D', ... };

這個數組在內存中看起來像這樣

+---+---+---+---+-----+
| A | B | C | D | ... |
+---+---+---+---+-----+

如果你想從那個數組中刪除字母'B' ,你會找到該字母的位置,然后將下一個字母( 'C' )復制到它的位置,然后將下一個字母( 'D' )復制到下一個字母中地方等

您當然可以使用單個循環執行此操作:

size_t index_to_remove = 1;  // The index of 'B'
for (size_t i = index_to_remove = 1; i < element_count - 1; ++i)
    array[i] = array[i + 1];

上面的循環很簡單,易於理解,並且易於在調試器中逐步完成。 它也不是很有效,特別是如果陣列很大。

所有上述復制實際上都可以通過對memmove函數的單次調用來完成:

memmove(&array[index_to_remove],
        &array[index_to_remove + 1],
        element_count - index_to_remove - 1);

上面的調用基本上與上面的循環相同,但是以更有效和優化的方式。

使用上述方法之一,循環或memmove調用,將保留數組如下:

+---+---+---+-----+
| A | C | D | ... |
+---+---+---+-----+

重要說明:請記住在“刪除”字符后更改element_count ,以便它反映新的大小。

對於您的第一個解決方法:

string str(s);

此語句聲明一個名為str並使用s的內容初始化content

這個語句作為你的對象沒有影響s

所以你需要調用str.erase()而不是s.erase()

暫無
暫無

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

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