zwei char array Felder zu einem String verknüpfen
-
Hallo allerseits,
ich bin absoluter Neuling auf dem Gebiet C++ und stehe vor dem Problem,
zwei char-array-Felder pArgs[2] und pArgs[3] in eine Variable zu schreiben.Ich habse es bereits mithilfe der Forensuche so probiert:
#include <stdio.h> #include <string.h> int strcpyMain () { char str1[50]=pArgs[2]; char str2[50]=pArgs[3]; char str3[100]; strcpy (str2,str1); strcpy (str3,"copy successful"); printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); return 0; }
Funktioniert aber, wie ihr sicher schon sehen könnt, nicht.
pArgs[2] und pArgs[3] sind zwei Datei-Aufrufe. Einmal notepad.exe und dann eine .txt-Datei.
Grüße und danke in voraus,
Filip
-
Bist du sicher dass du im richtigen Forum bist? das ist pures C. kein C++, was du da schreibst.
Und was du damit wirklich erreichen willst sieht man nicht so recht, das sieht ziemlich wüst aus. Fehlen dir da noch die Grundlagen zur Stringmanipulation in C oder C++?
-
Hallo Filip,
das sieht mir nach den Beispiel von hier aus:
http://www.cplusplus.com/reference/clibrary/cstring/strcpy/Wenn
pArgs[2] == "notepad.exe"
und
pArgs[3] == "eine.txt"ist, dann sollte es nach deinen beiden strcpy-Zeilen so aussehen:
str1 == "notepad.exe"
str2 == "notepad.exe"
str3 == "copy successful"Die Ausgabe müsste also
str1: notepad.exe str2: notepad.exe str3: copy successful
sein, weil
strcpy (str2,str1);
den Inhalt von str2 mit dem Inhalt von str1 überschrieben hat.
Welche Ausgabe erhälst du denn und welche hättest du eigentlich erwartet?
Gruß
DobiPS: Minimalbeispiele, die von den anderen direkt ohne Änderungen durchkompiliert und getestet werden können, sind immer am besten.
pumuckl schrieb:
Fehlen dir da noch die Grundlagen zur Stringmanipulation in C oder C++?
Ich vermute, dass er gerade noch dran ist, sich diese zu erarbeiten.
-
Ahh, ich komme schon etwas weiter.
es sieht jetzt so aus:
char *str1=pArgs[2]; char *str2=pArgs[3]; printf ("str1: %s str2: %s",str1,str2); return 0;
wie kann ich nun den ausdruck hinter printf in einer variable zusammenfassen?
danke schonmal für die hilfe!
-
Da du weiterhin C schreibist und auf die Frage nach der Sprache leider nicht eingegangen bist verschieb ich dich mal ins C-Forum
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Strings zusammenfügen machst du mit strcat.
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { if (argc==3) { char *str1=argv[1]; char *str2=argv[2]; printf ("Teilstrings:\n"); printf ("str1: %s str2: %s\n",str1, str2); int len = strlen(str1)+strlen(str2); char *strGesamt = new char[len]; // Speicher beantragen strcat(strGesamt, str1); // zu strGesamt (leer) str2 hinzufügen strcat(strGesamt, str2); // zu strGesamt (belegt mir str1) str2 hinzufügen printf ("Zusammengefügt:\n"); printf("%s\n", strGesamt); } return 0; }
Bemerkungen:
Der "beste Weg" ist das sicherlich nicht. Mit C++ geht das deutlich schöner.
Der Speicher sollte auch noch freigegeben werden...Gruß
trooper
-
trooper schrieb:
...
...new char[len]...
Das ist ja gar kein C, was Du da schreibst - das ist C++!!
(in Umkehrung eines klassischen Vorwurfs aus dem C++-Forum)Gruß,
Simon2.
-
Ja, wenn man es genau nimmt sollte die Zeile
*char strGesamt = new char[len];
durch
strGesamt = (char)malloc(len);*
ersetzt werden um reines ANSI-C zu haben. (auchso #include <stdlib.h> müsste dann ebenfalls einfügen)
*Immer auf meinen Quellcodes rumhacken*
-
trooper schrieb:
Ja, wenn man es genau nimmt sollte die Zeile
*char strGesamt = new char[len];
durch
strGesamt = (char)malloc(len);*
ersetzt werden um reines ANSI-C zu haben. (auchso #include <stdlib.h> müsste dann ebenfalls einfügen)
*Immer auf meinen Quellcodes rumhacken*
[klugscheißer]
wenn, dann richtigstrGesamt = malloc(len+1);
strGesamt[0] = '\0';
[/klugscheißer]Thou shalt not cast malloc!
-
[klugscheißer]
wenn, dann richtigstrGesamt = malloc(len+1);
[/klugscheißer]Thou shalt not cast malloc!
Das ist sehr wohl notwendig, denn ...
error: invalid conversion from 'void' to 'char'**malloc liefert void* zurück.
Netter Versuch...
Mit dem len+1 möchte ich mich jetzt nicht zu weit aus dem Fenster legen. Damit hast Du recht.
-
trooper schrieb:
[klugscheißer]
wenn, dann richtigstrGesamt = malloc(len+1);
[/klugscheißer]Thou shalt not cast malloc!
Das ist sehr wohl notwendig, denn ...
error: invalid conversion from 'void' to 'char'**malloc liefert void* zurück.
Netter Versuch...
wenn du aber C Code mit einem C++ kompilierst, dann kann ich dir nicht weiter helfen
kompiliere ohne cast mit einem C Compiler und dann wirst du es sehen.
-
Das ist jetzt wirklich Klugscheisserer...
Den Cast vergessen und darauf bauen, dass ein reiner C-Compiler es trotzdem schluckt zeugt nicht von Professionalismus.
void* != char*
Meinst Du nicht das es besser ist als Anfänger gleich richtig C/C++ zu lernen und nicht erst was falsches. Und den Cast zu vergessen und darauf hoffen, dass der Compiler es macht ist definitiv falsch.
Das C ungefragt die Typen übernimmt ist eher schlecht. C++ ist da etwas strenger.
-
naja,
c compiliert man besser mit einem c compiler
c++ mit einem c++ compilerin c kann ich ohne warnung einen void* auf einen char* zuweisen
in c++ eben nicht.
Auch andere Castings werden in c++ angewart oder führen zu Fehlern,
in c dann eben nicht.ich hatte schon einigen Ärger mit 'falsch' compiliertem c-code.
Deswegen:
c compiliert man besser mit einem c compiler
c++ mit einem c++ compilerDas kann natürlich jeder so halten wie er möchte,
aber man kann nicht erwarten, daß Postings berücksichtigen
das der gepostete C-Code mit sich mit einem c++ compiler übersetzten lässt.Übrigends ist es umgekehrt auch problematisch,
nicht jeder c-code der durch einen c++ complier geht funktioniert auch
mit einem c-complier.Gruß Frank
-
trooper schrieb:
strcat(strGesamt, str1); // zu strGesamt (leer) str2 hinzufügen
strcat(strGesamt, str2); // zu strGesamt (belegt mir str1) str2 hinzufügen
printf ("Zusammengefügt:\n");
printf("%s\n", strGesamt);
}Besser wäre gleich
strcpy(strGesamt, str1); str1-Inhalt nach strGesamt kopieren
nebst richtigem Kommentar sowie Einsparung der Initialisierung von strGesamt für folgendes strcat.
Außerdem liegen die Variablendefinitionen nicht am Blockbeginn, das ist erst mit C99 aufgeweicht worden und der meistverwendete Compiler im dieser betroffenen Systemumgebung (Windows) macht kein C99.
-
Ich sagte es bereits malloc liefert void* und nicht char*.
Kompiliere das Programm mit einem C-Compiler. Das klappt wunderbar, klar weil der Cast auch unter C richtig ist - nur eben nicht unbedingt notwendig. Ohne Warnung heißt noch lange nicht dass es auch richtig ist.Sowas führt zu Programmen wie:
void main() {
...}
Funktioniert unter den vielen Compilern wunderbar - ist aber heute falsch.fnk(str)
char* str;{
...}
Sollte man heute auch nicht mehr machen.Gerade durch so etwas kamen die Fehler zu Stande. Ob es richtig war ist dabei egal oder ob es der C-Compiler schluckte mit, C99 ist es dass nicht mehr. Und ich denke nicht dass der Fragesteller Lust dazu hat veraltete Dinge zu lernen nur um sie dann schnell wieder vergessen zu müssen, da er sie falsch gelernt hat.
Und mal ehrlich wir sind bei C99. Warum sollte der Fragesteller veraltete Sachen lernen.
---
*Wutz*
"...Einsparung der Initialisierung...", sollte man tunlichst lassen, denn damit kann man prima auf die Nase fallen.
Ob strcpy oder strcat bei diesem Beispiel völlig unerheblich.
Falsch ist es nicht und langsamer auch nicht. Es schafft im Gegenteil nur Verwirrung. Besonders wenn man gerade C/C++ lernt.Man kann im übrigen an jedem Code meckern. Dem einen gefällt das nicht dem anderen dies. Klugscheissen geht immer...
Ob das dem Fragesteller was brachte ist eine andere Frage. Falls ihr weiter Lust dazu habt nur zu. Ich hab für sowas jedenfalls keine Zeit.
-
@trooper: in C (mit Betonung auf C) muss man nicht kasten, da C die Typenkonvertieren void* -> was_weiß_ich* automatisch macht (das ist so im Standard definiert, auch in C99, und die Compiler halten sich dran). Deshalb heißt C und nicht C++. Und aus diesem Grund (und anderen) sollte man nicht von C/C++ reden, weil es sich um zwei unterschiedlichen Sprachen handelt.
Wenn man C code mit einem C++ Kompiler übersetzt, dann stimmt es mit dem Cast, aber es ist generell eine schlecht Idee C Code durch den C++ Compiler zu jagen.
Und wenn du damit ein Problem hast, ist das nicht meine Schuld. So ist es nun mal in C (mit Betonung auf C).
-
Ich nutze hier mal die Stunde der Gunst um mal eine andere (WinAPI) Variante zu präsentieren:
char Target[512]; ZeroMemory(Target, sizeof(Target)); _snprintf(Target, sizeof(Target) - 1, "%s%s", str1, str2); // Bei neueren Compilern auch durch _snprintf_s zu ersetzen !!!
-
@supertux
Eigentlich wollte ich hier nichts mehr drauf antworten, aber bei so viel Sturheit
kann ich einfach nicht anders.1. Zum einen kenne ich sehr wohl die Unterschiede zwischen ANSI C und C++.
Ich bin schon etwas älter und damit groß geworden (von AmigaDos, UNIX,
MSDOS auf Win95/98 zu Linux heute).2. Verdrehe mir nicht die Worte im Mund.
"...C (mit Betonung auf C) muss man nicht kasten..."
Was anderes habe ich nicht behauptet. Wenn du meinen Post aufmerksam gelesen hättest stand das da
(gleich oben "...nur eben nicht unbedingt notwendig..."). Ich meine nur das es besser ist es von Anfang an zu machen, da es oft notwendig werden kann (und später in C++ dann sogar gefordert wird) und dann kommt es oft zu Verwirrungen, wenn man es vergessen hatte.
Und C (mir Betonung auf C) macht gar nichts automatisch, sondern es konvertiert einfach in
den Typ der vorne steht. Red mir also nicht "im C99 Standard" definiert, ließ ihn besser erstmal.3. "...ist generell eine schlecht Idee C Code durch den C++ Compiler zu jagen"
Nein, es ist keine Schlechte Idee gleich richtig zu Casten, da es wie gesagt in C++ Pflicht wird. Und wenn einer deinen "tollen" Quellcode mal in C++ übernehmen möchte, dann hat er mit so einer Haltung von dir arge Probleme. Was nützt dir ein Code der nur unter reinem C läuft. Hättest du den Cast von Anfang an gesetzt, dann wäre es für die Koder nach dir wesentlich einfacher. Es gleich mit einem C++ Compiler zu testen (mit Betonung auf testen) ist dann wohl der bessere Ansatz. C (mir Betonung auf C) läd nämlich zum schlampigen programmieren geradezu ein. Deswegen ist C99 dann auch deutlich strenger geworden.Ich unterstelle mal du hast noch nicht in größeren Softwareprojekten mitgearbeitet oder gar ältere C-Codes konvertieren müssen, sonst wüsstet du das.
Das deutet jedenfalls alles darauf hin:
"...und die Compiler halten sich dran..." - in welcher heilen Welt lebst du?
MSVC unterstützt bis Version 2008 das C99 nicht vollständig (weiß nicht ob er es inzwischen wirklich vollständig beherrschst). Dein Nickname suggeriert mir Linux (only?). Wirklich Plattform übergreifenden Code zu schreiben ist gar nicht so einfach.Ich denke es ist besser von Anfang an gleich beide Welten im Auge (also C/C++) zu behalten. Und einem C-Anfänger zu reinem C (mir Betonung auf C) zu drängen ist totaler Unsinn meiner Meinung nach. Das führt dann dazu, dass es massenweise Literatur gibt, bei der die abgeschriebenen Quelltexte nicht laufen
und die Anfänger ihre Lust verlieren, da der Autor der Meinung war: "Muss man nicht - dann lass ich es halt weg.".Gruß
Trooper
-
ich habe noch nie einem Anfänger (und einem reinen Programmieranfänger schon gar nicht) C empfohlen und das werde ich auch nicht tun, obwohl C meine Lieblingssprache ist und mich damit am besten auskenne, deshalb kenne ich C-Schwächen auch gut.
Ich musste bis jetzt zum Glück nicht an große Projekte arbeiten, wo man Windows/Unix portabel sein muss, also muss ich zugeben, dass ich da wenig Erfahrung habe. Unter Linux verwenden ich (und meine ganze Abteilung) den GNU GCC Compiler und unseren Code ist nicht dafür ausgelegt, dass er überall und mit jedem Compiler läuft, also Gedanken in der Art "ob das mit dem MSVC auch läuft..." musste ich mir während der Arbeit nicht machen, das geb ich zu.
Ich persönlich halte ich für eine schlechte Idee, C Code komplett in C++ zu übernehmen, nicht nur wegen den Casts, sondern weil es noch andere Inkompatibilitätsprobleme gibt, die nicht immer bekannt sind und auch der Compiler dir nicht verrät. Warnt dir etwa der C++ Compiler, dass
sizeof 'a'
1 ist und nicht 4 wie in C?#include <stdio.h> int main(void) { printf("C%s\n", sizeof(char) == sizeof('a') ? "++" : ""); return 0; }
$ gcc -oc c.c $ ./c C $ g++ -oc c.c $ ./c C++
http://david.tribble.com/text/cdiffs.htm deshalb finde ich es für eine schlechte Idee.
Vielleicht ist der GCC Scheiße, aber beim Code
include <stdlib.h> int main(void) { int *var; var = malloc(10 * sizeof *var); free(var); return 0; }
kriege ich nicht einmal mit den CFLAGS="-std=c99 -ansi -pedantic -Wall" eine Warnung.