Ausgabe in einer Zeile
-
Ich dachte du möchtest strcat() nachprogrammieren. Jetzt lässt du es ja ganz weg.
-
AJ schrieb:
Ich dachte du möchtest strcat() nachprogrammieren. Jetzt lässt du es ja ganz weg.
Ich hab erstmal die Lösung hier probiert, aber ich will immer noch das strcat() nachbauen, damit ich die gleiche Funktion habe.
Ich komme damit aber nicht so voran, wie ich mir das vorstelle und daher hab ich kurzerhand was anderes gemacht, was ich auch noch in einem anderen Programm gebrauchen kann.
-
Also ich hab den Auftrag ohne Funktion des jetzt zu machen. Dabei sollen die Eingabezeilen ausgelesen werden und die chars einzeln ausgelesen werden:
for (index1 = 0; index1 <= (LaengeInput1-1); index1++) { Buchstabe = *(pcInput1+index1); *(pcErgebnis+index1) = Buchstabe; } for (index2 = 0; index2 <= (LaengeInput2-1); index2++) { Buchstabe = *(pcInput2+index1); *(pcErgebnis+index2) = Buchstabe; }
Soweit hab ich den Code, doch ich bekomme immer wieder einen Fehler, wenn das Programm in diese Zeile sprint:
*(pcErgebnis+index1) = Buchstabe;
Soweit ich sehe, ist es ein Speicheradressenfehler, aber ich weiß nicht woher dieser kommt, da pcErgebnis ausreichend Speicher bietet.
-
Um mehr sagen zu können, müsste man wissen, was in Input steht und wieviel Speicher für Ergebnis reserviert ist.
-
So weit so gut !
#include <stdio.h> #include <alloc.h> #define MAX 50 int strlen(char *s); void Kopieren(char *s, char *t); #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; /* 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; } for (index2 = 0; index2 <= (LaengeInput2-1); index2++) { Buchstabe = *(pcInput2+index2); *(pcErgebnis+index2) = Buchstabe; } printf("\nAusgabe 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; }
Es geht nun darum die ausgelesene zweite Zeile an die ausgelesen erste Zeile dran zu hängen. In dieser Zeile werden die Zeilen ausgelesen und den Pointern zugewiesen, aber ich möchte nun, dass Input2 direkt nach der ausgelesenen Zeile dran gehängt wird:
for (index1 = 0; index1 <= (LaengeInput1-1); index1++) { Buchstabe = *(pcInput1+index1); *(pcErgebnis+index1) = Buchstabe; } for (index2 = 0; index2 <= (LaengeInput2-1); index2++) { Buchstabe = *(pcInput2+index2); *(pcErgebnis+index2) = Buchstabe; } printf("\nAusgabe des Ergebnisses %s", pcErgebnis);
Eingabe 1: alexander
Eingabe 2: FranzAusgabe: alexanderFranz
Fehler der derzeit auftritt: Nur Eingabe 2 wird ausgegeben. Der Fehler liegt im obigen Quellcode-Abschnitt !
-
Servus!
Es sollen 2 sachen eingelesen werden und dann so:Eingabe1: Hal
Eingabe2: loAusgabe: Hallo
wie in diesem Bsp. ausgegeben werden.
Ich habe eine lösung mit selbst geschriebener Funktion:#include <stdio.h> #include <conio.h> #define SIZE 30 void copy(char *a,char *b); int main() { char *p1,*p2; char a[2*SIZE]={0},b[SIZE]={0}; printf("Eingabe1:"); fgets(a,SIZE,stdin); printf("Eingabe2:"); fgets(b,SIZE,stdin); p1=&a[0]; p2=&b[0]; copy(p1,p2); printf("\nAusgabe: "); fputs(a,stdout); getch(); return(0); } void copy(char *a,char *b) { int x=0,p=0; while(a[p]) { p++; } p--; for(x=0;x<=SIZE;x++) { a[p]=b[x]; p++; } }
mfg hohesC
die Funktion copy(a,b); fügt an a den array b an!
-
okay das ist auch eine Lösungsmöglichkeit
Zu deinem Quellcode hab ich aber einige Fragen !
1. Frage: Wieso benutzt du bei char a zweimal SIZE ? Soll darin das Ergebnis sein, wodurch du mehr Platz brauchen würdest ?!? Und wieso stellst du 0 in die geschweiften Klammern ?
char a[2*SIZE]={0},b[SIZE]={0};
2. Frage: Was wird hier genau gemacht ? Wird hier "p1" Null zugewiesen ?
p1=&a[0];
-
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