Problem mit Array zuweisung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Problem mit Array zuweisung

Beitrag von Jside » Do Okt 15, 2009 4:42 pm

...beim zuweisen der geparsten(= Quoting und Variablenvorzeichen entfernen) Strings ins argv Array, was einfach nicht klappen will(siehe z.b. arg[arga] = qstring;). Ich find den Fehler einfach nicht....
Die Funktion soll Quotes entfernen, und Variablen heraussuchen, daher

$var = "Text 123"

soll im arg array so herauskommen:
{ "var", "=", "Text 123" }
und im array argt(Definition, was was ist, damit z.b. Variablen von einer anderen Funktion ausgelesen werden können)
{ 1,2,0}

Code: Alles auswählen

int parse_cmd(char *cmd) {
	//int len = strlen(cmd);
	int quote = 0;
	int var   = 0;
    int i     = 0;
    int j     = 0;
    int arga  = 0;
    int args  = 0; 
    
	char qstring[200];
	char ostring[200];
		
	char *arg[200];
	int   argt[200];	
	
	if(!cmd) return -1;
	
	while(*cmd != 0) {
		if(quote == 1) { 
	    	if((*cmd == '"') || (*cmd == '\'')) {
			    quote = 0;
			    
			    qstring[i] = '\0';
			    args = 1;
			    argt[arga] = 0;
			    printf("Quote: %s;\n",qstring);
		    }
		    else {
		    	qstring[i] = *cmd;
		    	i++;
		    }
		}
		else if(var == 1) { 
			if(*cmd == ' ') {
			    var = 0;	
			    
			    qstring[i] = '\0';
			    
			    args = 1;
			    argt[arga] = 1;
			    printf("Var: %s;\n",qstring);
			}
			else {
		    	qstring[i] = *cmd;
		    	i++;				
			}
			
		}
		else if(((*cmd == '"') || (*cmd == '\'')) && quote == 0) { /
			quote = 1;
		}
		else if((*cmd == '$') && var == 0) {
			var = 1;
		}
		else {
			if(*cmd != ' ') {
			    ostring[j] = *cmd;
			    j++;
			}
			else {
			    ostring[j] = '\0';
			    printf("Other: %s\n",ostring);
			    j = 0;
			    arg[arga] = ostring;	
			    argt[arga] = 2;
			    arga++;
			    ostring[0] = '\0';
			}
		}
		if(args == 1) {
		    args = 0;
		    
		    arg[arga] = qstring;
		    
		    qstring[0] = '\0';
		    i = 0;
		    
		    arga++;	
		}
		cmd++;
	}
	char msg[200];
	printf("arg: %s argo: %d\n",arg[0], arga);
	if(var == 1) {
	    sprintf(msg,"%s line: %d unexpected token \"$\"\n", fname, line);
	    sys_error(msg);	
	    return -1;
	}
	if(quote == 1) {
	    sprintf(msg,"%s line: %d expecting end of quote\n", fname, line);
	    sys_error(msg);	
	    return -1;
	}	
Die Funktion ist übrigends nur auf meine Test-Weise programmiert (= einfach drauf los, um zu testen).

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Problem mit Array zuweisung

Beitrag von Kerli » Do Okt 15, 2009 6:08 pm

Jside hat geschrieben:...beim zuweisen der geparsten(= Quoting und Variablenvorzeichen entfernen) Strings ins argv Array, was einfach nicht klappen will(siehe z.b. arg[arga] = qstring;). Ich find den Fehler einfach nicht....
Was geht denn genau nicht? Was einmal auf jeden Fall zu Problemen führt ist die von dir erwähnte Zuweisung. Überlege doch einmal was für einen Typ 'arg[arga]' hat und was bei der Zuweisung passiert. 'arg' ist ein Array von Char-Zeigern, und wenn du jetzt denn Zeiger an der Stelle 'arga' im Array auf 'qstring' setzt wird der Zeiger immer an die Stelle von qstring zeigen. Wenn du also später wieder an die Stelle 'ostring[0]' Null hinschreibst, dann erscheinen bei einer Ausgabe natürlich auch keine Zeichen. Da wäre es also angebracht zb. mit malloc für jeden geparsten String Platz zu reservieren und diesen dann mit strcpy dort hinein zu kopieren.

Übrigens könnte der Code etwas leichter verständlich sein wenn du aussagekräftigere Namen vergeben würdest ;)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8861
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit Array zuweisung

Beitrag von Xin » Do Okt 15, 2009 6:52 pm

Kannst Du ein (soweit möglich) lauffähiges Testprogramm zippen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sonic
Beiträge: 29
Registriert: Do Aug 13, 2009 6:58 pm

Re: Problem mit Array zuweisung

Beitrag von sonic » Fr Okt 16, 2009 1:14 pm

Wie Kerli schon gesagt hat,

reserviere dir für dein Array von strings speicher

Code: Alles auswählen

int i = 0;
for(i; i < 200; i++)
   arg[i] = malloc(255);
Dann speicherst du die Werte mit strncpy in dein Array also statt

Code: Alles auswählen

arg[arga] = ostring // oder qstring
nutzt du strncpy

Code: Alles auswählen

strncpy(arg[arga], ostring, strlen(ostring));
Danach gibst du wenn du deinen speicher nicht mehr brauchst diesen frei

Code: Alles auswählen

for(i; i < 200; i++)
   free(arg[i]);
Frei nach dem refrain für Let it be...

Write in C, Write in C,
Write in C, yeah, Write in C.
Only wimps use BASIC.
Write in C.

Antworten