我需要反轉字串,但單詞之間只保留一個空格。
例子:
" na vrh brda vrbaa mrdaa!!! "
"!!!aadrm aabrv adrb hrv an"
代碼:
#include <iostream>
#include <string>
std::string ReverseOneSpace(std::string s) {
std::string str = s;
int j = 0;
for (int i = s.length() - 1; i >= 0; i--) {
// skip spaces
while (s[i] == ' ' && i >= 0)
i--;
while (s[i] != ' ' && i >= 0) {
str[j] = s[i];
j ;
i--;
}
// add only one space
if (s[i] == ' ') str[j] = ' ';
j ;
if (i == 0) break;
}
return str;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << str << "\"" << std::endl;
std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"";
return 0;
}
輸出:
"!!!aadrm aabrv adrb hrv an aa!!! " // my output
"!!!aadrm aabrv adrb hrv an" // correct
為什么字串反轉后我有一些額外的字符?
uj5u.com熱心網友回復:
在你的兩個while回圈中,你都超出了界限。變數i最終將是“-1”。
請將您的 while 回圈中的條件從>=更改為>。
其他原因可能是一些設計問題。您永遠不應該i使用其他陳述句更改回圈體內的回圈變數(此處)。
#include <iostream>
#include <string>
std::string ReverseOneSpace(std::string s) {
std::string str = s;
int j = 0;
for (int i = s.length() - 1; i >= 0; i--) {
// skip spaces
while (s[i] == ' ' && i > 0) // ************
i--;
while (s[i] != ' ' && i > 0) { // ************
str[j] = s[i];
j ;
i--;
}
// add only one space
if (s[i] == ' ') str[j] = ' ';
j ;
if (i == 0) break;
}
return str;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << str << "\"" << std::endl;
std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"";
return 0;
}
uj5u.com熱心網友回復:
你也可以試試我的代碼,我正在使用reverse函式,所以我不需要從后面回圈字串
#include<iostream>
#include<string>
using namespace std;
std::string ReverseOneSpace(std::string s) {
bool flagSpace = false;
bool flagWord = false;
reverse(s.begin(), s.end());
std::string result = "";
for(auto c : s) {
if (c == ' ') {
if (flagWord) flagSpace = true;
} else {
flagWord = true;
}
if (c != ' ') {
if (flagWord && flagSpace) {
result = ' ';
flagSpace = false;
flagWord = false;
}
result = c;
}
}
return result;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << str << "\"" << std::endl;
std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"" << std::endl;
return 0;
}
代碼將像這樣列印到終端
"!!!aadrm aabrv adrb hrv an"
"!!!aadrm aabrv adrb hrv an"
uj5u.com熱心網友回復:
另一種解決方案是使用 C 庫中可用的內容:
- std::istringstream的使用消除了檢查空格的需要。
- 使用std::reverse將自動反轉字串。
將這些放在一起會產生以下程式:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
std::string ReverseOneSpace(std::string s)
{
std::istringstream strm(s);
std::string word;
std::string ret;
// Loop for each word found
while (strm >> word)
{
// Reverse the word
std::reverse(word.begin(), word.end());
// Add reversed word to front of the result string
ret = word " " ret;
}
// Remove the excess space at the back
ret.pop_back();
return ret;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << s << "\"" << std::endl;
std::cout << "\"" << str << "\"" << std::endl;
return 0;
}
輸出:
" na vrh brda vrbaa mrdaa!!! "
"!!!aadrm aabrv adrb hrv an"
請注意,沒有檢查空格。手動檢查空格很容易出錯,至少大部分時間是在第一次嘗試撰寫此類代碼時。那么,如果有東西(在這種情況下std::istringstream)為您檢查空間,為什么還要浪費時間呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469241.html
