|
| [c++] string replace Fra : Kasper Lindberg |
Dato : 05-06-06 13:03 |
|
hej NG,
hvordan erstatter man nemmest "\n" med "\r\n", givet en lang tekststreng der
indeholder et ukendt antal linieskift (i form af _kun_ "\n")
Jeg har fundet mange beskrivelser af replace-funktioner, men ikke nogen hvor
man angav hvilken streng der skulle erstattes, og med hvad.
mit bedste bud er at kopiere tekstrengen, tegn for tegn, og indsætte "\r"
når jeg finder et "\n". --> Overkill
/Kasper
| |
Mogens Hansen (05-06-2006)
| Kommentar Fra : Mogens Hansen |
Dato : 05-06-06 13:30 |
|
"Kasper Lindberg" <NoSp@m.invalid> wrote in message
news:44841d9b$0$15786$14726298@news.sunsite.dk...
> hej NG,
>
> hvordan erstatter man nemmest "\n" med "\r\n", givet en lang tekststreng
> der indeholder et ukendt antal linieskift (i form af _kun_ "\n")
>
> Jeg har fundet mange beskrivelser af replace-funktioner, men ikke nogen
> hvor man angav hvilken streng der skulle erstattes, og med hvad.
#include <string>
int main()
{
using namespace std;
string s = "This is line 1\n"
"This is line 2\n"
"This is line 3\n";
for(string::size_type i = s.find("\n"); string::npos != i; i =
s.find("\n", i + 2)) {
s.replace(i, 1, "\r\n");
}
}
Venlig hilsen
Mogens Hansen
| |
Kasper Lindberg (05-06-2006)
| Kommentar Fra : Kasper Lindberg |
Dato : 05-06-06 15:45 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:448423e8$0$67263$157c6196@dreader2.cybercity.dk...
>
> "Kasper Lindberg" <NoSp@m.invalid> wrote in message
> news:44841d9b$0$15786$14726298@news.sunsite.dk...
>> hvordan erstatter man nemmest "\n" med "\r\n", givet en lang tekststreng
>> der indeholder et ukendt antal linieskift (i form af _kun_ "\n")
>>
> #include <string>
>
> int main()
> {
> using namespace std;
>
> string s = "This is line 1\n"
> "This is line 2\n"
> "This is line 3\n";
> for(string::size_type i = s.find("\n"); string::npos != i; i =
> s.find("\n", i + 2)) {
> s.replace(i, 1, "\r\n");
> }
> }
>
takker.
jeg skrev dog lidt videre på den så den blev lidt mere generel
void VBReplace(string* str, string str_search_for, string str_replace_with){
size_t searchlen=str_search_for.length();
for(string::size_type i = (*str).find(str_search_for,0);string::npos != i;
i = (*str).find(str_search_for, i +
searchlen+1)) {
(*str).replace(i, searchlen, str_replace_with);
}
}
/Kasper
| |
Mogens Hansen (05-06-2006)
| Kommentar Fra : Mogens Hansen |
Dato : 05-06-06 16:09 |
|
"Kasper Lindberg" <NoSp@m.invalid> wrote in message
news:448443a7$0$15783$14726298@news.sunsite.dk...
>
> "Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
[8<8<8<]
Jeg ville ændre
> void VBReplace(string* str, string str_search_for, string
> str_replace_with){
> size_t searchlen=str_search_for.length();
til
(string& str, const string& str_search_for, const string& str_replace_with)
str ændres fra "pointer to string" til "reference to string" for at indikere
at det er påkrævet at string objektet findes.
str_search_for og std_replace_with ændres til "const reference to string"
for at undgå at der oprettes en kopi, og for at indikere at funktionen ikke
ændrer på objektet.
[8<8<8<]
> size_t searchlen=str_search_for.length();
til
const string::size_type searchlen=str_search_for.length();
Venlig hilsen
Mogens Hansen
| |
Soeren Sandmann (07-06-2006)
| Kommentar Fra : Soeren Sandmann |
Dato : 07-06-06 17:45 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> writes:
> #include <string>
>
> int main()
> {
> using namespace std;
>
> string s = "This is line 1\n"
> "This is line 2\n"
> "This is line 3\n";
> for(string::size_type i = s.find("\n"); string::npos != i; i =
> s.find("\n", i + 2)) {
> s.replace(i, 1, "\r\n");
> }
> }
Er den algoritme ikke O(n^2)? Jeg formoder at s.replace() er lineaer i
laengden af s. Algoritmen der kopierer til en ny streng er O(n), saa
hvis strengene kan vaere lange, er den nok et bedre valg.
| |
Thorsten Ottosen (06-06-2006)
| Kommentar Fra : Thorsten Ottosen |
Dato : 06-06-06 11:38 |
| | |
|
|