Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ?????? buffer[] ??????

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
26.04.2004, 16:28 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das hilft mir bei einer fehlersuche immer noch nicht viel.
ich habs gerade mal selber mit nem teststring durch den compiler gejagt und ausgeführt.

also folgendes funzt bei mir


C++:
int ersetzen(char *such, char *neu, char *inp){
int flag,rv=0;
char *p,*q,*r,*tmp;
    tmp=new char[strlen(inp)+1];
    for(p=inp;*p;++p){
        flag=1;    
        for(q=such,r=p;*q&&*r&&flag;++q,++r)if(*q-*r)flag=0;
    
        if(flag){
            for(q=tmp;*q++=*r++;);
            for(q=neu,r=p;*r++=*q++;);
            for(q=tmp,--r;*r++=*q++;);
            ++rv;
        }        
    }

    delete [] tmp;

    return rv;
}


int main(){

char inp[1000];
sprintf(inp,"trlalala 1234 asdfasdf gmx 1234 ende feierabend 1234");

printf("%s\n",inp);
ersetzen("1234","abc",inp);
printf("%s\n",inp);
}




an sonsten müsstest du schon mal genauer zeigen wie du das aufgerufen hast, welche dimensionen inp hat und welcher string da genau zu dem zeitpunkt in inp war (der dann hoffentlich auch 0 terminiert war)
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 26.04.2004 um 16:29 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
26.04.2004, 16:35 Uhr
~Theo_aus_Lodz
Gast


Ja, du hast ja recht. Wenn ich anstatt inp einen vernünftigen String übergebe, dann klappt es bei mir auch. Aber mit inp stürzt er immer an einer bestimmten Stelle ab... Kann es sein, dass z.B. irgendein Array oder so zu klein ist?? (wie gesagt ist inp eine einzige Zeile mit ca. 100000 chars)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
26.04.2004, 16:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also wenn das was du ersetzt kürzer ist als das was vorher da stand sollte es auf keinen fall probleme geben. Ich hab ja auch extra geschrieben das der aufrufer dafür sorgen muss das inp entsprechend gross ist.
was noch problem machen könnte wären sowas wie rekursive ersetzungen.

soll heissen wenn du ab durch abc ersetzt wird er danach wieder ab finden. wenn du das nicht willst musst du den pointer p nach dem erstezen um strlen(neu weiterhopsen lassen)
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
26.04.2004, 18:23 Uhr
Pablo
Supertux
(Operator)


Was ich jetzt sehen, ist dass wir eine C/C++ Suppe kochen. @Theo_aus_Lodz: in welcher Sprache willst du das?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
26.04.2004, 18:25 Uhr
(un)wissender
Niveauwart


Das sollte funzen, auch wenn man etwas kürzeres mit etwas längerem ersetzt.
Übersichtlich ist es meiner Meinung nach auch.
Ist sogar ein bisschen getestet.
Hoffentlich ist das reines C, habe mich bemüht.
In C++ wäre das ganze sehr einfach, std::string::replace.


C++:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char * replace(const char * originalString,
               const char * oldSubstring,
               const char *newSubstring);
              
int equals(const char * one, const char * two, int length);

int main(int argc, char *args[])
{
    char * newString = 0;
    if(argc < 3)
    {
        printf("Mehr Parameter!");
        return 0;
    }
    
    printf("Old string: %s\n", args[1]);
    
    newString = replace( args[1],  args[2],  argc > 3 ?  args[3] : "" );      
    printf("New string: %s\n", newString);
    
    free(newString);
    return 0;
}

char * replace(const char * originalString,
               const char * oldSubstring,
               const char *newSubstring)
{
    int lengthOfOld      = strlen(oldSubstring),
        lengthOfNew      = strlen(newSubstring),
        lengthOfOriginal = strlen(originalString);
      
    const char * maxChar = originalString + lengthOfOriginal;
    char * newString, * newStringRun;
    
    //Nichts ist zu erstetzen
    if(!lengthOfOld)
    {
        newString = (char *)malloc(lengthOfOriginal + 1);    
        return strcpy(newString, originalString);
    }
    
    //Theoretisch maximale Länge des neuen Strings ermitteln und allokieren.
    newString = (char *)malloc(lengthOfOriginal +
        (lengthOfNew - lengthOfOld) * (lengthOfOriginal / lengthOfOld) + 1);
    
    newStringRun = newString;          
            
    while(originalString <= maxChar)
    {
        if(equals(originalString, oldSubstring, lengthOfOld))
        {
            memcpy( newStringRun, newSubstring, lengthOfNew );
            originalString += lengthOfOld;
            newStringRun   += lengthOfNew;      
        }
        else
        {        
            *newStringRun++ = *originalString++;    
        }
    }
    
    *newStringRun = '\0';
    return newString;
}

//Besser wäre nach Pratt und Konsorten, so ist es aber einfacher zu verstehen!
int equals(const char * one, const char * two, int length)
{  
    int i = 0;
    
    while(i++ < length)
    {
        if(*one++ != *two++) return 0;
    }
    
    return 1;
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
27.04.2004, 09:22 Uhr
~Theo_aus_Lodz
Gast



Zitat:
Windalf postete

C++:
int ersetzen(char *such, char *neu, char *inp){
int flag,rv=0;
char *p,*q,*r,*tmp;
    tmp=new char[strlen(inp)+1];
    for(p=inp;*p;++p){
        flag=1;    
        for(q=such,r=p;*q&&*r&&flag;++q,++r)if(*q-*r)flag=0;
    
        if(flag){
            for(q=tmp;*q++=*r++;);
            for(q=neu,r=p;*r++=*q++;);
            for(q=tmp,--r;*r++=*q++;);
            ++rv;
        }        
    }

    delete [] tmp;

    return rv;
}



also wenn das was du ersetzt kürzer ist als das was vorher da stand sollte es auf keinen fall probleme geben. Ich hab ja auch extra geschrieben das der aufrufer dafür sorgen muss das inp entsprechend gross ist.
was noch problem machen könnte wären sowas wie rekursive ersetzungen.

soll heissen wenn du ab durch abc ersetzt wird er danach wieder ab finden. wenn du das nicht willst musst du den pointer p nach dem erstezen um strlen(neu weiterhopsen lassen)

Danke, das Funktioniert echt gut. Aber wie kann ich das jetzt noch umbauen, damit ich auch einen längeren String ersetzen kann (anstatt bisher nur einen kürzeren)?Also dass ich den Pointer irgendwie weiter hopsen lassen muss, weiß ich ja, aber wie???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
27.04.2004, 10:01 Uhr
(un)wissender
Niveauwart


Ich würde vorschlagen, du liest mal die Posts.
In diesem Fall meinen, da habe ich dir nämlich genau so eine Funktion erstellt, die auch noch viel übersichtlicher ist.


Bearbeitung:

...sogar mit main zum ausprobieren!
Dein "Pointerhopsen" ist hier in der if-Abfrage in der while-Schleife realisiert.


C++:
if(equals(originalString, oldSubstring, lengthOfOld))
{
    memcpy( newStringRun, newSubstring, lengthOfNew );
    [b]originalString += lengthOfOld;
    newStringRun    += lengthOfNew;[/b]      
}




--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 27.04.2004 um 10:08 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
27.04.2004, 10:21 Uhr
~Theo_aus_Lodz
Gast


Hab jetzt aber nicht wirklich Lust, meinen gesamten Quellcode noch mal umzuschreiben. Habe ja den von Windalf weitgehend benutzt und in meinen Code eingebaut. Wär schön wenn ich es daran irgendwie verändern könnte, aber trotzdem vielen Dank...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
27.04.2004, 10:50 Uhr
(un)wissender
Niveauwart


Du musst überhaupt nichts umschreiben.
CopyPaste die Funktion(en), dann windalf-funktionenname ersetzten mit meinem und fertig.
Vielleich 5 Mausklicks...
Egal, mach was du willst.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
27.04.2004, 11:04 Uhr
~Theo_aus_Lodz
Gast


@ (unwissender)

wenn ich das so mache und deinen Code nehme kommt beim Linken immer noch irgendein Fehler...

Und zwar:

Code:
Linker-Vorgang läuft...
test.obj : error LNK2001: Nichtaufgeloestes externes Symbol "char * __cdecl replace(char const *,char const *,char const *)" (?replace@@YAPADPBD00@Z)
Debug/test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

test.exe - 2 Fehler, 0 Warnung(en)

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: