Zum Inhalt springen

Kopieren des Inhalten von argv[?]!?


Empfohlene Beiträge

Geschrieben

Nun, es geht mir darum das ich den Inhalt von argv[2], argv[3], ..., argv[n] in einem Array speichern möchte. Nun ist meine Frage, wie? Einfach nur strcpy geht nicht. Bei dem Versuch:

 	strcpy(Eingabe[scnt2], argv[y]); 

gibt er mir die Fehlermeldung 'strcpy' : cannot convert parameter 2 from 'char' to 'const char *'!

Was muss ich ändern?

Bine

<FONT COLOR="#a62a2a" SIZE="1">[ 31. Oktober 2001 10:23: Beitrag 1 mal editiert, zuletzt von Woodstock ]</font>

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>Nun, es geht mir darum das ich den Inhalt von argv[2], argv[3], ..., argv[n] in einem Array speichern möchte. Nun ist meine Frage, wie? Einfach nur strcpy geht nicht. Bei dem Versuch:

 	strcpy(Eingabe[scnt2], argv1[y]); 

gibt er mir die Fehlermeldung 'strcpy' : cannot convert parameter 2 from 'char' to 'const char *'!

Was muss ich ändern?

Bine</STRONG>

Geschrieben

@ Koltzkopp:

Also, die 1 bei dem argv1[y] stammt noch aus einem Versuch, sorry, ist im Orginal schon vor meiner Frage wieder verändert worde, mache es gleich auch hier in meiner Frage.

@captain haddock:

Nee, habe ich nicht. Kann es an der Übergabe liegen?

Warum ich das mache? Mein Chef meinte ich solle es besser machen, zur Sicherheit, damit ich nicht durch einen dummen Zufall eventuell etwas daran verändere. Und ich habe auch das Problem dass wenn ich argv[n], mit welchem Index auch immer direkt in der Überprüfung nehme, das er mir dann genau die gleiche Fehlermeldung gibt.

Bine

Geschrieben

Hmmmmmmmmmm, das wundert mich, daß dein Compiler argv[] als char bertrachtet, entweder Erstellen->alles neu erstellen oder suchen, ob irgendwo eine falsche Deklaration ist, ich wüßte nur nicht wo. Du hattest ja in main() (jedenfalls im letzten verfügbaren Post) char* argv[] deklariert. Welchen Typ hat denn Eingabe ?

Das mit Sicherheit ist natürlich ein Argument. Anstelle des Kopiertheaters könntest du auch anders einen Schreibschutz auf argv setzen:

const char** const myArgv = argv;

Das ist jetzt C++ und kein C, wichtig! Das erste const macht die Daten Konstant, d.h. du darfst sie über myArgv nicht mehr ändern. Das zweite macht den Zeiger Konstant, d.h. du darfst ihn nicht auf eine andere Adresse umsetzen. Wenn du nun konsequent immer über myArgv zugreifst, gibt es keine "dummen Zufälle" mehr.

Weiterhin jkannst du alle Parameter von Funktionen, die nicht verändert werden sollen/dürfen, const deklarieren. Dies ist ein Sicherheitsmechanismus, den man kennen und anwenden sollte.

Geschrieben

Hey Woodstock,

argv ist ein Array der Zeiger enthält, dementsprechend muss man ihn auch sorgfältig kopieren.

Code kommt im neuen Beitrag - habe eine bessere Lösung gefunden. (alter Code gelöscht)

<FONT COLOR="#a62a2a" SIZE="1">[ 31. Oktober 2001 11:22: Beitrag 2 mal editiert, zuletzt von multimac ]</font>

Geschrieben

Also, erstes Problem gelöst. Ich weiß nicht warum (wie eigentlich immer), aber mus an der Übergabe gelegen haben, habe sie neu geschrieben, und jetzt geht's. Aber, neues Problem.

Also, ich habe main argv als Parameter ja so übergeben: char *argv[], also übergebe ich den anderen Funktionen argv so: char **argv. Damit hat er scheinbar auch gar kein Problem, denn er compilt und linkt. Aber, ich komme in die Funktion trotzdem nicht rein (Habe ich durch die Ausgabe von 'Hallo' ganz am Anfang der Funktion überprüft). Nur, was neu für mich ist, er stürzt ja scheinbar ab, aber er hängt sich auf, und gibt mir keine Fehlermeldung (auch wenn ich die ja eh nicht verstehe). Und man kann aus dem Programm nur raus, wenn man es über AltGr+Strg+Entf beendet.

Hiiiilfe!

Bine

Geschrieben

Hast du mal einen Breakpoint draufgesetzt. (Auf die Funktion auf die du nicht kommst) Oder einfach mal bis dahin gesteppt.

<FONT COLOR="#a62a2a" SIZE="1">[ 31. Oktober 2001 11:18: Beitrag 1 mal editiert, zuletzt von DocNeo ]</font>

Geschrieben

So, nun aber :-)



#include <stdio.h>

#include <malloc.h>

#include <string.h>


static char **_argv_kopieren(char **argv, int argc)

{


	char **kopie = (char **) malloc( sizeof (char *) *argc);


	if( kopie  == NULL)

	{

		printf("Fehler!\n");

		return(NULL);

	}


	memcpy(kopie , argv, sizeof( char *) *argc);


	return(kopie);

}


int main(int argc, char **argv)

{

	char **argv_kopie = _argv_kopieren ( argv, argc );



	if(argv_kopie == NULL)

	{

		printf("Fehler!\n");

		return(1);

	}



	for(int j = 0; j < argc; ++j)

	{


		printf("%d - %s\n", j, argv_kopie[j]);


	}


	return(0);

}

  

Nun hast du eine gesamte Kopie von argv.

Gruß,

multimac

<FONT COLOR="#a62a2a" SIZE="1">[ 31. Oktober 2001 11:25: Beitrag 1 mal editiert, zuletzt von multimac ]</font>

Geschrieben

Kann ich das kopieren nicht nicht dynamisch machen? Weil ich das auch möglichst nicht soll (im Moment). Ich habe ja ein Array in die ich diese Eingaben bisher gespeichert habe, allerdings durch einlesen von der Tastatur aus dem Programm heraus.

Also, es geht mir eigentlich nur darum den Inhalt von argv[2], argv[3], ... argv[n] in einem Puffer zu speichern (damit ich die eingabe auf lower setzten kann), und dann den Inhalt des Puffers wiederum in das Array welches ich schon bisher für die Suchbegriffe genutzt habe (welches ja jetzt wo ich nichts mehr in dem Programm von der Tastatur eingeben lasse, frei ist).

Bine

Geschrieben

Versuchs mal so:


void ppcpy(char** dest, const char** src, int last, int first = 0)

{

	for(int d = 0, s = first; s < last; d++, s++)

	{

		strcpy(dest[d], src[s]);

		_strlwr(dest[d]);

	}

	dest[d] = NULL; // Sicherheit durch Nullterminierung

}

Aufruf:

ppcpy(Eingabe2, argv, argc, 2 /* oder ab wo du anfangen willst */);

<FONT COLOR="#a62a2a" SIZE="1">[ 31. Oktober 2001 11:58: Beitrag 2 mal editiert, zuletzt von captain haddock ]</font>

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...