![](/img/trans.png)
[英]How to get the digits of a number without converting it to a string/ char array?
[英]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) ),但這會導致以下編譯錯誤:
我嘗試過的另一種解決方法是:
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;
}
現在這是有趣的部分,我沒有得到任何錯誤,但是一旦我選擇了自定義字母刪除功能,調試就會崩潰。 這就是它所說的:
任何幫助將非常感激,堅持這一個一個星期吧!
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.