Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » String zurückgeben in C

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 <
000
03.05.2007, 00:09 Uhr
jack26



Hi leute,

ich hab grad irgendwie nen Hänger, und zwar habe ich eine Funktion geschrieben, der ein String übergeben wird und diesen anschließend von allen Leerzeichen befreit zurückgibt.
Nur leider gibt er ihn mir nicht korrekt am Bildsichrm wieder aus.
Mein Programm sieht so aus:


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


#define Z 30                                                    
char puffer[Z];

char *extractLeer(char *string) {

    char *ptr;
    int i=0, j=0;

    while(string[i] != '\0') {
        if(string[i] == ' ') {     // Falls an dieser Stelle in string ein Leerzeichen ist
            i++;       // wird i erhöht, um das nächste Element anzuprechen
            continue;         // und die Schleife wieder durchlaufen
        }
        else
            puffer[j]=string[i];    // Schreibt den String in einen neuen
            i++;                      // nur ohne Leerzeichen
            j++;            
    }
    ptr=puffer;   // Hier will ich den Pointer auf die 1te Stelle des puffer-Arrays setzen
    return ptr;   // Ich gebe den Pointer zurück, der die Adresse von puffer[0] führt

}



int main( void )
{  
    char string[Z];
    char *ptr;
    int i;
    int laenge;

    gets(string);

    ptr=extractLeer(string);      // ptr zeigt auf puffer

    laenge=strlen(puffer);

    for(i=0; i<=laenge; i++)
        printf("%c",(*ptr)+i);  // Nacheinander ausgeben worauf ptr zeigt
}



Wäre nett, wenn jemand einen Blick auf mein Programm werfen könnte und mir sagen könnte wo mein Fehler liegt oder wie man es besser machen könnte.

Vielen Dank

Gruß
jack26


Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt. Nächstes mal selbst machen.


Dieser Post wurde am 03.05.2007 um 00:15 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.05.2007, 00:24 Uhr
0xdeadbeef
Gott
(Operator)


Sieht so aus, als hättest du Verständnisprobleme mit der Speicherverwaltung. Such mal in der C/C++ FAQ nach einem Beitrag mit Titel "malloc & co".

Prinzipiell ist die gängigste Methode, sowas in C zu realisieren, einen Buffer samt Länge mit zu übergeben und da reinzuschreiben, also z.B.

C++:
char *extract_spaces(char *dest, size_t n, char const *source) {
  size_t i, j;

  for(i = 0, j = 0; i < n - 1 && source[j]; ++j) {
    if(!isspace(source[j])) dest[i++] = source[j];
  }

  dest[i] = '\0';

  return dest;
}

// ...

char s[] = "Hallo Welt", s2[100];
puts(extract_spaces(s2, 100, s);


Eine andere Möglichkeit ist, den Speicher dynamisch zu alloziieren, allerdings darfst du dann nicht vergessen, ihn wieder freizugeben:

C++:
char *extract_spaces(char const *source) {
  char *dest = malloc(strlen(source) + 1);

  for(i = 0, j = 0; source[j]; ++j) {
    if(!isspace(source[j])) dest[i++] = source[j];
  }

  dest[i] = '\0';


  return dest;
}

// ...
char s[] = "Hallo Welt";
char *p = extract_spaces(s);
puts(p);
free(p);


Noch ne andere, aber weniger sinnvolle Möglichkeit ist, den Speicher statisch zu verwalten - so hast du das oben versucht, allerdings auf eine noch schlimmere Art und Weise, die den dynamischen namespace pollutet. Besser (aber immer noch schlecht):

C++:
char *extract_spaces(char const *source) {
  static char dest[100];

  size_t i, j;

  for(i = 0, j = 0; i < 99 && source[j]; ++j) {
    if(!isspace(source[j])) dest[i++] = source[j];
  }

  dest[i] = '\0';

  return dest;
}


Das fliegt dir allerdings spätestens dann um die Ohren, wenn du mehrere Threads benutzt, und du musst aufpassen, dass du Kopien anlegst, wenn du den Kram irgendwo aufbewahren willst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.05.2007, 00:33 Uhr
Blubber2063



Da Beefy deine Fehler bezüglich der Speicherverwaltung schon benannt hat sag ich dir mal warum dein Programm nicht richtig lief, erstens du hast den Ergebnisstring nicht 0 terminiert, das kopieren der 0 hast du vergessen.

2. Deine Ausgabefunktion ist mist du musst den Pointer vor dem dereferenzieren dekrementieren, du addierst hier immer nur i auf das erste Zeichen. Und versuch doch hier nicht alles neu zu erfinden, für sowas gibts es printf("%s", string), bzw schneller, puts(string).

Nebenbei gets zu benutzen und keine Pufferlänge dran zu haben ist einfach tödlich.

So dein Code war zwar nicht toll, aber hier mal ohne Verbesserungen es tut was du wolltest, wie gesagt das ist nicht schön:

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


#define Z 30                                                    
char puffer[Z];

char *extractLeer(char *string) {

    char *ptr;
    int i=0, j=0;

    while(string[i] != '\0') {
        if(string[i] == ' ') {    
            i++;      
            continue;  
        }
        else
            puffer[j]=string[i];  
            i++;                  
            j++;            
    }
    puffer[j]='\0';
    ptr=puffer;
    return ptr;

}



int main( void )
{  
    char string[Z];
    char *ptr;
    int i;
    int laenge;

    fgets(string, 30,stdin);
    printf("%s", string);

    ptr=extractLeer(string);      

    laenge=strlen(puffer);

    printf("%s", ptr);
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: