Seite 1 von 1

Problem mit Array zuweisung

Verfasst: Do Okt 15, 2009 4:42 pm
von Jside
...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).

Re: Problem mit Array zuweisung

Verfasst: Do Okt 15, 2009 6:08 pm
von Kerli
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 ;)

Re: Problem mit Array zuweisung

Verfasst: Do Okt 15, 2009 6:52 pm
von Xin
Kannst Du ein (soweit möglich) lauffähiges Testprogramm zippen?

Re: Problem mit Array zuweisung

Verfasst: Fr Okt 16, 2009 1:14 pm
von sonic
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]);