[英]How to correctly replace a character in a string c++?
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string passCode;
passCode = "1 ";
int i;
for(i =0; i < passCode.length();i++){
if(isspace(passCode.at(i)) == true){
passCode.replace(i,1,"_");
}
}
cout << passCode << endl;
return 0;
}
上面的代碼,我的方向是[在2個字符的字符串passCode中用'_'替換任何空格''。 如果不存在空間,則程序不應打印任何內容。]
我的代碼目前的方式是,它輸出“1”。 當我運行條件檢查false而不是true時,它會打印“_”。 我不知道為什么這樣做,任何人都看到我不這樣做的問題? 我不被允許使用該算法。 頭。 我也只允許在main,沒有函數或導入的頭文件/類中工作。
對於單個字符,使用std::replace
算法可能更容易:
std::replace(passCode.begin(), passCode.end(), ' ', '_');
如果您不能使用算法標題,您可以推出自己的replace
功能。 它可以通過一個簡單的循環完成:
template<typename Iterator, typename T>
void replace(Iterator begin, Iterator end, const T& old_val, const T& new_val)
{
for (; begin != end; ++begin)
if (*begin == old_val) *begin = new_val;
}
我的代碼目前的方式是,它輸出“1”。 當我運行條件檢查false而不是true時,它會打印“_”
isspace在傳遞空格時返回非零值。 這不一定是1.另一方面,布爾值true通常設置為1。
當我們將isspace的返回值與true進行比較時,當它們不完全相等時會發生什么? 具體來說,如果true為1且isspace只返回一些非零值,該怎么辦?
我想這就是這里發生的事情。 if條件失敗,因為這兩個值是不同的值。 所以空間不會被'_'取代。
您的問題是您使用isspace
。 如果您閱讀isspace
的文檔,它會說:
回報價值
如果確實c是空白字符,則值不等於零(即,為真)。 否則為零(即假)。
但是,您只檢查它是返回true
還是false
。 您的編譯器應該警告您不匹配,因為isspace
返回一個int
並且您正在檢查bool
。
更改為以下代碼應該適合您:
if(isspace(passCode.at(i)) != 0) {
passCode.replace(i,1,"_");
}
我的答案更具體地基於您的問題和您的評論,說除了您所包含的內容之外,您不能使用任何標題。 juanchopanza已經回答了一個更好的解決方案,你應該盡可能地使用標准庫,而不是編寫自己的代碼。
您也可以使用std::string::find
控制while循環並使用std::string::replace
空格。
std::string test = "this is a test string with spaces ";
std::size_t pos = 0;
while ((pos = test.find(' ', pos)) != std::string::npos)
{
test.replace(pos, 1, "_");
pos++;
}
std::cout << test;
如上所述這里 ,isspace為不返回布爾。 相反,它返回int,其中非零值表示true,零值表示false。 您應該像這樣寫支票:
if (isspace(passCode.at(i)) != 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.