Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Mein Programm stürzt ab...

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char *text;
  char *ersetzen;
  char *teil_ers;
  char *tmp;
  char *ausgabe;
  char *token=strtok(text,ersetzen);
 
  printf(" Text eingeben: ");
  scanf("%s",&text);
  fflush(stdin);
  printf("\n Welcher Teil soll erstezt werden? : ");
  scanf("%s",&ersetzen);
  fflush(stdin);
  printf("\n durch was? :");
  scanf("%s",&teil_ers);
  fflush(stdin);
 
  if(token)
  strcpy(ausgabe,token);
 
  printf("%s",ausgabe);
 
 
  system("PAUSE");
  return 0;
}

Irgendwie stürzt das Programm ab.
Ich habe die Vermutung das es an den Variablen liegt. Aber ich weiß nicht wie ich sonst Variablen unbekannter Größe angeben kann.

Antworten zu Mein Programm stürzt ab...:

Das hier fällt auf:

  char *text;
  char *ersetzen;
  char *token=strtok(text,ersetzen);

Was erwartest du denn von der strtok-Funktion an der Stelle? Die Eingaben sind ziemlich undefiniert, also wird es das Ergebnis auch sein ~

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Hier hab ich mir das abgeguckt. dachte das würde funktionieren... ::) 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich hab das ganze jetzt geändert.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char *text;
  char *ersetzen;
  char *teil_ers;
  char *tmp;
  char *ausgabe;
 
 
  printf(" Text eingeben: ");
  scanf("%s",&text);
  fflush(stdin);
  printf("\n Welcher Teil soll erstezt werden? : ");
  scanf("%s",&ersetzen);
  fflush(stdin);
  printf("\n durch was? :");
  scanf("%s",&teil_ers);
  fflush(stdin);
 
  char *token=strtok(text,ersetzen);
  if(token)
  strcpy(ausgabe,token);
 
  printf("%s",ausgabe);
 
 
  system("PAUSE");
  return 0;
}

Aber funktionieren tut das ganze immer noch nicht.
Kannst du mir icht wenigstens sagen wie das richtig sein müsste? Wäre echt nett.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Sind zwar noch einige (logische) Fehler drin, aber crasht zumindest nicht  ;D

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char text[100];
  char ersetzen[100];
  char teil_ers[100];
  char *tmp;
  char ausgabe[100];
 
  printf(" Text eingeben: ");
  scanf("%s",text);
  fflush(stdin);
  printf("\n Welcher Teil soll erstezt werden? : ");
  scanf("%s",ersetzen);
  fflush(stdin);
  printf("\n durch was? :");
  scanf("%s",teil_ers);
  fflush(stdin);
 
  char *token=strtok(text,ersetzen);
  if(token)
  strcpy(ausgabe,token);
 
  printf("%s",ausgabe);
  printf( "\n" );
 
  system("PAUSE");
  return 0;
}
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

okay.... ;D

Also kann man char *irgendwas nicht immer einsetzen? schade. was mach ich denn wenn einer jetzt 103 zeichen eingibt?

Ich hätte nicht mit PHP anfangen sollen ::)
da kann man soviel in eine variable reinschrieben, wie man (fast) will)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Wenn jemand 103 Zeichen eingibt, ist das Verhalten undefiniert. Es kann klappen, muss aber nicht. Also den Puffer immer groß genug wählen!
Du kannst natürlich auch std::string (C++) nehmen. Da kannst du auch soviel reinschreiben wie du willst. Und brauchst dich um nichts kümmern. Und ist viel einfacher und sicherer und besser und ...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

okay...aber ich bin im Moment noch bei C ;D
aber ich seh schon: das was ich alles machen möchte, kann C nicht...oder ich kann es nicht weil es in C zu schwer ist  ::)

Das Programm hat noch ein fehler.
Wenn ich "das ist ein Text eingebe"
und "ist" mit "war" ersetzen möchte.

kommt da am Ende "da" raus, obwohl ja eigentlich "das " stehen sollte.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das meinte ich mit den logischen Fehlern. Lies dir nochmal die Definition von strtok durch und du wirst feststellen, dass *jedes einzelne* Zeichen im zweiten Parameter als Trennzeichen dient. In deinem Beispiel eben auch das 's'.
Übrigens muss man nicht zwingend den ganzen C-Krempel verstehen, um vernünftig C++ zu programmieren... und C "kann" das schon, ist aber im Vergleich zu anderen Sprachen etwas komplizierter. Mal als Beispiel dein Programm in C++

#include <iostream>
#include <string>

int main( int argc, char *argv[] ) {
   
    std::string input;
    std::string replace;
    std::string replacement; 
   
    std::cout << "Text eingeben: ";
    std::getline( std::cin, input );
    std::cout << std::endl;
   
    std::cout << "Welcher Teil soll erstezt werden? : ";
    std::getline( std::cin, replace );
    std::cout << std::endl;
   
    std::cout << "durch was? : ";
    std::getline( std::cin, replacement );
    std::cout << std::endl;
   
    int pos = input.find( replace );
    if( pos == -1 ) {
        std::cout << replace << " nicht gefunden!" << std::endl;
    } else {
        input.replace( pos, replace.length(), replacement );
        std::cout << input << std::endl;
    }
           
    system("PAUSE");
    return 0;
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das ist ja irgendwie etwas einfacher.

Okay...
Also müsst eich das irgendwie anders machen:

Aus einer Zeichekette, den Teil raussuchen, der erstezt werden soll.
Dann den Teil davor in eine variable schreiben.
Jetzt muss ich den den ersetzenden Teil mit strcat() in die Varibale schrieben und dann den rest der Ausgangsvariable reinschrieben.

Ganz einfach. ;D

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Jep. Ganz einfach. Ein Tipp: guck dir mal strstr an. Das könntest du brauchen.
Noch was zur Bufferlänge: Du kannst bei scanf die Zahl der zu lesenden Zeichen begrenzen, so dass du nie über die maximale Länge hinauskommst. Hinten noch ne 0 anhängen und fertig:

char buffer[100];
scanf( "%99s", buffer );
buffer[99] = 0;

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich guck mal wie ich das damit mache...

Ich werd ein bisschen batseln und dann komm ich wieder  ;D

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char text[100];
  char ersetzen[100];
  char teil_ers[100];
  char ausgabe[100];
 
  printf(" Text eingeben: ");
  scanf("%s",text);
  fflush(stdin);
  printf("\n Welcher Teil soll erstezt werden? : ");
  scanf("%s",ersetzen);
  fflush(stdin);
  printf("\n durch was? :");
  scanf("%s",teil_ers);
  fflush(stdin);
 
  int i=0,count,a=0;
  char tmp[15][15];
  char* token;
 
  if(token=strtok(text," "))
  {
    tmp[i]=token;
    i++;
  while(token=strtok(NULL," "))
  {
     tmp[i]=token;
     i++;
  }
  }
  char ausgabe[150];
  for(i=0;i<20;i++)
  ausgabe=strcat(ausgabe,tmp[i]);

  system("PAUSE");
  return 0;
}

Also ich hab mir folgnedes überlegt:
Erstmal Teil ich den String in die einzelnen Wörter auf.
Diese sollen in tmp[20][20] abgespeichert werden.

Nur die Funktion strtoken funktioniert noch nicht so ganz :(

Naja...jedenfalls wird dann das Wort überschrieben und am Ende soll alles wieder zusammengefügt werden.

sollte dann für Wörter die durch Leerzwichen gtrennt sind funktionieren. 
« Letzte Änderung: 21.05.08, 10:57:39 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Sieht doch schon gar nicht so schlecht aus. Allerdings musst du statt tmp=token mit strcpy arbeiten:

strcpy( tmp[i], token );
Gibt sonst auch noch ein paar kleine Problemchen, aber die wirst du schon selbst finden. Oder nochmal fragen  ;D

Vielleicht nochmal ein allgemeiner Tipp zum Nachlesen:
http://www.cplusplus.com/reference/clibrary/
Enthält sehr schöne Erklärungen zu den ganzen Libraryfunktionen (strtok, strcpy, ...) mit kleinen Beispielen. Fand (und finde) ich ganz hilfreich, wenn man mal was nachschlagen muss... zum Beispiel könntest du scanf mal nachschlagen und überlegen, ob das tatsächlich das ist, was du willst (Zaunpfahl wink ;))
 
« Letzte Änderung: 21.05.08, 20:15:54 von Lisaa »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Fand (und finde) ich ganz hilfreich, wenn man mal was nachschlagen muss... zum Beispiel könntest du scanf mal nachschlagen und überlegen, ob das tatsächlich das ist, was du willst (Zaunpfahl wink ;))
 

Cool...ein Wink mit nem Zaunpfahl.
Das mit scanf() wurde/wird in einem Buch ständig benutzt.
in einem anderen benutzt der Autor gets(). Meintest du das mit dem Wink? Naja ich schau tritzdem mal nach ;D

Danke

« Dezimal in römische Zahlen mit Turbo oder Dev-Pascalmehrdimensionale arrays in C++ »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...

QR-Code
QR-Codes, die Abkürzung für "Quick Response Codes", sind eine Form von zweidimensionalen Barcodes. Damit lassen sich Informationen schnell und effizient speiche...