2014-01-26 47 views
-1

我想獲得一個字符串想要更改所有的字符到"X",這是我到達現在的地方。如何更改C++ 11中的字符串中的所有字符?

#include<iostream> 
#include<string> 
#include<cctype> 

using namespace std; 

int main() { 
    string line; 
    getline(cin, line); 
    for (decltype(line.size() index = 0; index != line.size(); ++index)) { 
     line[index] = "X"; 
    } 
    cout << line << endl; 
    return 0; 
} 

我想將所有字符更改爲"X"。請幫忙。

更新的代碼:

#include<iostream> 
#include<string> 
#include<cctype> 

using namespace std; 

int main() { 
    string line; 
    getline(cin, line); 
    for (decltype(line.size()) index = 0; index != line.size(); ++index) { 
     if (isspace(line[index])) { 
      line[index] += 1; 
      continue; 
     } 
     else { 
      line[index] = 'X'; 
     } 
    } 
    cout << line << endl; 
    return 0; 
} 

它打印!在串之間的空間,如何解決。

+1

錯誤括號和' 「X」'應該是''X''。除此之外,它應該工作。 – Jon

+0

不,如果您有其他問題,請將其作爲另一個問題發佈。 – StoryTeller

+0

你的問題中的「字符串」是什麼意思?你的字符串可能有空格嗎?你是否想用'X'替換空格,還是隻想替換字母數字字符?你想通過這條線實現什麼:line [index] + = 1; – qqqqq

回答

3

for(decltype(...)) interessting構建你也來了這裏。

你雖然可能想試試這個:

for (char& ch : line) 
{ 
    ch = 'X'; 
} 

或者這一個:

for(unsigned int i = 0; i < line.size(); i++) 
{ 
    line[i] = 'X'; 
} 

還要注意,有'X'"X"之間的差異: 第一個是一個字符字面量,第二個字符串字面量(這意味着返回類型是const char[2]而不是const char

+2

當編寫代碼時,一個算法是自我記錄的,即使在這裏,基於循環的範圍也是如此簡單,它也可以'std :: fill(begin(line),end(line),' X');' – galop1n

+0

@ galop1n有很多方法可以實現目標,但我認爲它更多地表達了OP如何以他想要的方式實現目標,因爲他顯然缺乏對集合進行迭代的知識一般。 – Paranaix

+0

你可以幫助更新的代碼。 – ajkumar25

6

使用填充構造

line = std::string(line.size(), 'X'); 

在C++ 11內部緩衝器將被移動,而不是被複制。

但是,如果你想避免分配一個新的緩衝區(以及丟棄舊緩衝區),你會想要與其他答案一起。

+1

這一個涉及到一個分配然後移動,或者如果存在一個小的字符串優化,內部緩衝區的副本更糟糕。 – galop1n

+0

@ galop1n,對於小字符串,內部緩衝區的副本不保證感嘆號。 – StoryTeller

+0

@ galop1n,同樣,您在Paranaix評論中發佈的解決方案本身非常優雅。你應該把它作爲答案。 – StoryTeller

2

使用range based for loopauto specifier(也this answer見):

for (auto& i: line) 
    i = 'X'; 
+0

可以幫助您更新代碼。 – ajkumar25

+0

我通過幾個鏈接改進了我的答案 –

+1

如果目標只是替換非空格字符,您可以使用'i = isspace(i)? ':'X';' – Edward

1

然而,另一種方式來做到這一點:

std::for_each(line.begin(), line.end(), [](char& c) { c = 'X'; }); 

你甚至可以使用decltype這裏:

std::for_each(s.begin(), s.end(), [](decltype(s[0]) c) { c = 'X'; }); 

但說實話,對於簡單的事情,只需使用簡單的循環

1

它總是好的首先搜索已經完成了你想要做的事情的標準庫函數。在這種情況下,std::string.replace會做的伎倆:

#include<iostream> 
#include<string> 

using namespace std; 

int main() { 
    string line; 
    getline(cin, line); 
    line.replace(0, line.size(), line.size(), 'X'); 
    cout << line << endl; 
    return 0; 
} 
相關問題