Ausgabe in einer Zeile



  • Da ich für b 30 habe benötige ich für a das doppelte!!!
    weil ich ja b an a dran hänge.
    wenn der benutzer für a 30 zeichen eingibt kann man ja nix mehr anhängen!!

    p1=&a[0];
    

    p1 ist ein pointer dem ich die adresse, des ersten elements des arrays a übergebe.

    Und wieso stellst du 0 in die geschweiften Klammern ?

    Ich setze alles auf 0!

    mfg hohesC



  • ah jetzt verstehe ich.... nun ist aber meine Aufgabe in diesem Beispiel, dass ich das Ergebnis in einen Pointer schreibe.

    Prinzip:
    pcInput1 + pcInput2 = pcErgebnis

    "pcErgebnis" soll das Ergebnis der zusammengesetzten Zeile enthalten !
    An diesem Problem sitze ich schon länger, weil mit zwei Variablen hab ich es schon gut hinbekommen !



  • @chillbert
    Dann schreib dir eine Funktion, die mind. 3 Parameter hat. Zwei Quellstrings und ein Zielstring. Als 4. Parameter solltest du noch die maximale Größe übergeben, die in den Zielstring gespeichert werden kann.
    In der Funktion kopierst du zunächst den Inhalt des 1. Quellstrings in den Zielstring mit Beachtung auf die maximale Anzahl (4. Parameter) und als zweites hängst du dann den Inhalt vom 2. Quellstring an den deinen Zielstring an, natürlich auch mit Beachtung der maximalen Anzahl.

    Übrigens:
    p1 = &a[0]; == p1 = a;



  • Eine Extra-Funktion zu schreiben war aber nicht nötig gewesen. Ich hab nun das Problem gelöst !:

    #include <stdio.h>
    #include <alloc.h>
    
    #define MAX 50
    
    int strlen(char *s);
    
    #include <stdio.h>
    #include <alloc.h>
    
    #define MAX 50
    
    int main(int argc, char* argv[])
    {
      char *pcInput1,
           *pcInput2,
           *pcErgebnis,
           Buchstabe,
           *ZwErgebnis;
      int LaengeInput1,
          LaengeInput2,
          LaengeErgebnis,
          index1,
          index2,
          index3,
          Laengepc;
    
      /* Den beiden Variablen wird der Speicherbereich zugewiesen,
      ab dem allokiert werden soll  */
      pcInput1 = (char*)malloc(MAX);
      pcInput2 = (char*)malloc(MAX);
    
      /* Initialisierung der Inteegr-Variablen */
      LaengeInput1 = 0;
      LaengeInput2 = 0;
      LaengeErgebnis = 0;
    
      /* Eingabeblock und Auslesen der Länge der Zeichenkette: Problematik hierbei ist, dass
      fgets die Zeile einliest, aber dabei den Zeilentrenner miteinliest. Dadurch haben
      wir einen Wert mehr, als die eingegebenen Buchstaben. */
      fgets(pcInput1, MAX, stdin);
      fgets(pcInput2, MAX, stdin);
      LaengeInput1 = strlen(pcInput1);
      LaengeInput2 = strlen(pcInput2);
    
      /* Hierbei wird der Zeilentrenner gesucht, der bei fgets miteingelesen wurde und
      dadurch Fehler in der Ausgabe eingefügt worden sind. */
      if(pcInput1[LaengeInput1-1] == '\n')
        if(pcInput2[LaengeInput2-1] == '\n')
      {
        pcInput1[LaengeInput1-1] = '\0';
        pcInput2[LaengeInput2-1] = '\0';
      }
      /* Nachdem man die Länge der beiden Eingaben hat, kann man den benötigten Speicher-
      bereich für das Ergebnis eintragen. Dabei brauch man aber auch nochmal ein Zeichen
      mehr, als die Eingabe, da das Nullzeichen am Ende der Ergebniszeile ebenfalls eine
      Stelle benötigt */
      LaengeErgebnis = (LaengeInput1-1 + LaengeInput2-1+1);
      pcErgebnis = (char*)malloc(LaengeErgebnis);
      //pcErgebnis = 0;
      printf("Anzahl der Zeichen bei Eingabe 1: %d\n", LaengeInput1-1);
      printf("Anzahl der Zeichen bei Eingabe 2: %d\n", LaengeInput2-1);
    
      /* Ausgabe der beiden Zeilen mit der Funktion, aber ohne Überschreibung in einen
      Ziel-Pointer, der einen genau passenden allokierten Bereich besitzt. */
      for (index1 = 0; index1 <= (LaengeInput1-1); index1++)
      {
        Buchstabe = *(pcInput1+index1);
        *(pcErgebnis+index1) = Buchstabe;
        ZwErgebnis = pcErgebnis;
        Laengepc = strlen(ZwErgebnis);
      }
      for (index2 = 0; index2 <= (LaengeInput2-1); index2++)
      {
        Buchstabe = *(pcInput2+index2);
        *(pcErgebnis+Laengepc+index2) = Buchstabe;
      }
      printf("\nAusgablexe des Ergebnisses: %s", pcErgebnis);
    
      /* Ausgabe der Laenge des Ergebnisses */
      LaengeErgebnis = LaengeInput1-1 + LaengeInput2-1;
      printf("\nAusgabe der Länge des Ergebnisses: %d\n", LaengeErgebnis);
    
      /* Freigabe des Speichers */
      free(pcInput1);
      free(pcInput2);
      free(pcErgebnis);
      getch();
      return 0;
    }
    
    int strlen(char *s)
    {
      char *p = s;
      while (*p != '\0')
        p++;
      return p - s;
    }
    

    Hierbei hab ich den Part genauer beleuchtet und dann so angepasst, dass die zweite Eingabe an die erste dran gehängt wird.

    for (index2 = 0; index2 <= (LaengeInput2-1); index2++)
      {
        Buchstabe = *(pcInput2+index2);
        *(pcErgebnis+Laengepc+index2) = Buchstabe;
      }
      printf("\nAusgablexe des Ergebnisses: %s", pcErgebnis);
    


  • cHillb3rT schrieb:

    if(pcInput1[LaengeInput1-1] == '\n')
        if(pcInput2[LaengeInput2-1] == '\n')
      {
        pcInput1[LaengeInput1-1] = '\0';
        pcInput2[LaengeInput2-1] = '\0';
      }
    

    Und wenn nur eine der Zeichenketten auf \n endet?
    Mach da zwei getrennte if-Abfragen draus.



  • Eigentlich gehts bei dem Programmierzug darum nur das vorletzte Zeichen zu ersetzen.... Demnach müsste ich nicht mal eine Abfrage machen, sondern kann es gleich umschreiben ! 💡



  • cHillb3rT schrieb:

    Eigentlich gehts bei dem Programmierzug darum nur das vorletzte Zeichen zu ersetzen....

    Es geht um das letzte Zeichen, nicht das vorletzte.

    Demnach müsste ich nicht mal eine Abfrage machen, sondern kann es gleich umschreiben ! 💡

    Das letzte Zeichen muss aber kein \n sein. Das ist ja der Sinn von fgets, dass es nicht zwangsläufig bis zum Zeilenende liest.



  • Moment, beim Debuggen stelle ich immer wieder fest, dass ein \n in der Zeichenkette vorkommt.
    Dieses will ich ja nur weg haben und ich bin mir sicher, dass fgets außer im Fall der Überschreitung des maximalen Wertes für eine Zeile immer bis zum Zeilenende liest.



  • cHillb3rT schrieb:

    außer im Fall der Überschreitung des maximalen Wertes

    Das meinte ich.



  • Diesen Fall kann man dann ja noch mit einer ausgewählten Fehlermeldung belegen.
    Dann hätte man auch dieses Problem an sich gelöst.
    Ich arbeite nun mal an anderen Versionen dieses Programms weiter 😉 😉


Anmelden zum Antworten