C: Hilfe bei Programm (strings umwandeln)

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Do Sep 12, 2013 9:44 pm

Helfen ist nicht das Problem, aber ich möchte Dir ruhig nochmal die Tutorial-Seite zu dem Thema anraten:

c:tutorials:param

Ansonsten auch das komplette Tutorial.
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.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Fr Sep 13, 2013 12:16 pm

Hallo.

Ich habs endlich geschafft das Programm über die Kommandozeile zu starten.
Irgendwie will es mit dem Aufrauf "Praktikum Auf.5 6+9" nicht klappen also hab ich es in rechner umbenannt.
Jetzt wird das Programm auch mit dem Aufruf "rechner 6+5" gestartet.

Allerdings hab ich noch ein einziges Problem.
Ich wollte meinen Quelltext eig so lassen wie er ist...ich scheiter allerdings daran den String von argv[1] (was ja die Rechnung sein sollte (5+6)) in meinen String st[10] zu bekommen mit dem die ganze Operation durchgeführt wird.
Die Funktion strcpy() kann ich ja nicht benutzen da dann ja wieder der Programm Name mit übergeben wird.

Generell bin ich ein bisschen verwirrt...die Zahl in [] gibt doch normal das Stringelement an oder nicht?
Also wenn ich einen String hätte s[3]="abc" und würde s[1] aufrufen wäre das doch das "b" oder?
Nach dem Motto lass ich ja auch die isdigit() Funktion den String absuchen...er geht immer st mit i++ weiter bis nen Zeichen kommt.

Deswegen versteh ich nicht ganz wie in argv[1] mein ganzes erstes Argument liegen kann (also z.B. "abc")?

Oder hab ich irgendwas fatal falsch verstanden...?

Nochmal der aktuelle Code:

Code: Alles auswählen

int main (int argc, char *argv[] ){

	char st [10],zeichen,ch1[15],ch2[15];
	int z1,z2,e,i=0,j=0;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	while (isdigit (st[i])){ // 1. Array mit den ersten Ziffern
		ch1[i]=st[i];
		i++;
	}
	ch1[i]='\0';
	
	zeichen=st[i]; // Das Rechenzeichen
	i+=1;
	while (isdigit (st[i])){ // 2. Array mit den folgenden Ziffern
		ch2[j]=st[i];
		i++;
		j++;
	}
	ch2[j]='\0';
	if (st[i] != '\0'){ // Falls mehr Zeichen nachher kommen
		printf("Fehler!\n Ihre Eingabe entspricht nicht dem gewuenschtem Format\n");
		exit(0);
	}
	
	else {
	
	printf("ch1 ist: %s\n",ch1);
	printf("zeichen ist: %c\n",zeichen);
	printf("ch2 ist: %s\n",ch2);
	
	z1= atoi(ch1);
	z2= atoi(ch2);

	printf("Zahl 1 ist: %d\n Zahl 2 ist: %d\n",z1,z2);

	switch (zeichen)
	{
	case '+':
		e=z1+z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;

	case '-':
		e=z1-z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;

	case '*':
		e=z1*z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;
		
	case '/':
		e=z1/z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;

	default:
		printf("FEHLER!!");
		break;


	}
	}
}

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

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Fr Sep 13, 2013 12:26 pm

Monkey101 hat geschrieben:Hallo.

Ich habs endlich geschafft das Programm über die Kommandozeile zu starten.
Irgendwie will es mit dem Aufrauf "Praktikum Auf.5 6+9" nicht klappen also hab ich es in rechner umbenannt.
Guter Plan. Der Aufruf müsste mit

Code: Alles auswählen

"Praktikum Auf.5" 6+9
funktionieren. Ansonsten versucht er "Praktikum" aufzurufen und übergibt als erstes Argument "Auf.5"
Monkey101 hat geschrieben:Ich wollte meinen Quelltext eig so lassen wie er ist...ich scheiter allerdings daran den String von argv[1] (was ja die Rechnung sein sollte (5+6)) in meinen String st[10] zu bekommen mit dem die ganze Operation durchgeführt wird.
Die Funktion strcpy() kann ich ja nicht benutzen da dann ja wieder der Programm Name mit übergeben wird.
argv1 enthält nur "6+9", nicht den Programmnamen. Der steht in argv[0]
Monkey101 hat geschrieben:Generell bin ich ein bisschen verwirrt...die Zahl in [] gibt doch normal das Stringelement an oder nicht?
Also wenn ich einen String hätte s[3]="abc" und würde s[1] aufrufen wäre das doch das "b" oder?
Die [] sind ein Array (Anreihung) zugriff. Du greifst auf das n-te Element zu. Im Fall eines (1!) Strings, was eine Anreihung von chars (Buchstaben) ist, erhältst Du einen Buchstaben. Bei einer Anreihung von Buchstaben-Anreihungen (Strings) bekommst Du eine Buchstabenanreihung (einen String) zurück.
Argv ist ein (char * [] ), wobei * und [] semantisch (fast) das gleiche sind. Es ist also ein Array von Zeigern auf den ersten Buchstaben (des Strings).
Monkey101 hat geschrieben:Nach dem Motto lass ich ja auch die isdigit() Funktion den String absuchen...er geht immer st mit i++ weiter bis nen Zeichen kommt.
Deswegen versteh ich nicht ganz wie in argv[1] mein ganzes erstes Argument liegen kann (also z.B. "abc")?
Oder hab ich irgendwas fatal falsch verstanden...?

Lies Dir die ersten Kapitel des C-Tutorials zum besseren Verständnis durch. Da steht das alles ausführlich drin.

In den Kapiteln stehen auch die Fragen beantwortet drin, die als nächstes kommen. ;-)
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.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Fr Sep 13, 2013 1:08 pm

Hi.

Hab mir die Kapitel mal durchgelesen...leider komm ich immernoch nicht weiter.
Aber mal zum Verständnis.
Ich geb über die Konsole jetzt "5+6" ein.
Dann ist mein argv[1] ein Zeigerarray der auf die 5 zeigt? Und mir dann denn String dadurch ausgeben kann (also 5+6)?

Aber wie krieg ich den jetzt dazu genau diesen String in meinen char Array st[10] zu kopieren?
Ich würds ja gern nach dem Motto:
st[]=*argv[1] machen.
Leider geht das ja nicht weil der bei st[] ne Zahl braucht (was allerdings nicht möglich ist weil ich ja mehr als nur 1 zeichen reinkopieren will).

Muss ich das jetzt iwi wieder mit ner Laufvariable klären damit der mir das reinkopiert?
Also ich hab generell keine Ahnung wie ich auf den String in argv[1] zugreifen kann :(

mfg Monkey101

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

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Fr Sep 13, 2013 1:24 pm

Monkey101 hat geschrieben:Hi.

Hab mir die Kapitel mal durchgelesen...leider komm ich immernoch nicht weiter.
Aber mal zum Verständnis.
Ich geb über die Konsole jetzt "5+6" ein.
Dann ist mein argv[1] ein Zeigerarray der auf die 5 zeigt? Und mir dann denn String dadurch ausgeben kann (also 5+6)?
Ja - und Nein. ^^

Ja: argv[1] zeigt auf die 5.
Nein: argv[1] zeigt auf "5+6".

argv[1] ist ein (char *), also ein Zeiger auf ein char. Dieses Char ist die '5', daher ja. Aber gemeint ist hier eigentlich, der Zeiger auf das erste Zeichen von beliebig vielen - eben "5+6".
Monkey101 hat geschrieben:Aber wie krieg ich den jetzt dazu genau diesen String in meinen char Array st[10] zu kopieren?
Ich würds ja gern nach dem Motto:
st[]=*argv[1] machen.
Leider geht das ja nicht weil der bei st[] ne Zahl braucht (was allerdings nicht möglich ist weil ich ja mehr als nur 1 zeichen reinkopieren will).
Sowas gibt's in C nicht. Du musst eine Schleife schreiben, die solange kopiert, wie Du Ziffern findest:

Code: Alles auswählen

for( unsigned int i = 0; isdigit( argv[1][i] ); i++ ) firstOperand[i] == argv[1][i];
Bei der zweiten Schleife musst Du aber darauf achten, dass der String des zweiten Operanden - das Ziel der Stringkopie nunmal vorne beginnt (Index == 0), aber Du bei argv[1] schon einige Bytes überspringen musst - nämlich "5+". Entsprechend kannst Du nicht einfach so den gleichen Index nehmen.
Monkey101 hat geschrieben:Muss ich das jetzt iwi wieder mit ner Laufvariable klären damit der mir das reinkopiert?
Also ich hab generell keine Ahnung wie ich auf den String in argv[1] zugreifen kann :(
Du kannst mit argv[1] genauso umgehen wie mit st zuvor. Beide haben den gleichen Datentyp.
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.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Fr Sep 13, 2013 1:36 pm

Hi.

Ich glaub so langsam komm ich drauf.
Mir fehlte "argv[1]".
Wusste nicht das ich so auf die Elemente in argv zugreifen kann.
Dachte immer so wären nur die Mehrdimensionalen Arrays (Matrizen) definiert.

Ich könnte jetzt einfach alle st[] sachen durch argv[1][] ersetzen dann dürfte ja alles funktionieren...
Aber, auch um mein Verständnis zu verbessern, es muss doch irgendwie möglich sein den Inhalt von argv[] in meinen String st[] zu bekommen oder?
Hatte sowas in die Richtung probiert...scheint aber nicht zu funktionieren.

Code: Alles auswählen

while (argv[1][k] != '\0'){
		st[k]=argv[1][k];
		k++;

	}
mfg Monkey101

edit: Ach bei dem Aufruf handelt es ich um nen 2. dimensionales Array...

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

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Fr Sep 13, 2013 2:04 pm

Monkey101 hat geschrieben:Hi.

Ich glaub so langsam komm ich drauf.
Mir fehlte "argv[1]".
Wusste nicht das ich so auf die Elemente in argv zugreifen kann.
Dachte immer so wären nur die Mehrdimensionalen Arrays (Matrizen) definiert.

Das ist eine (Art) Matrix, wie ein Texteditor: Zeilen stehen untereinander und Du kannst auf Zeile 1 an Position i zugreifen.
argv sind alle übergebenen Argumente.

Monkey101 hat geschrieben:Ich könnte jetzt einfach alle st[] sachen durch argv[1][] ersetzen dann dürfte ja alles funktionieren...
Aber, auch um mein Verständnis zu verbessern, es muss doch irgendwie möglich sein den Inhalt von argv[] in meinen String st[] zu bekommen oder?

Nein. Dein String ist eine Zeile( char [] ), argv sind viele Zeilen ( char [] [] entspricht char * [] entspricht char ** ).

Monkey101 hat geschrieben: Hatte sowas in die Richtung probiert...scheint aber nicht zu funktionieren.

Code: Alles auswählen

while (argv[1][k] != '\0'){
		st[k]=argv[1][k];
		k++;

	}
Das funktioniert nur beim ersten Array und da ist das Ziel etwas, was kein digit ist.
Beim zweiten Operanden brauchst Du für st und argv[1] unterschiedliche Indizes.
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.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Fr Sep 13, 2013 2:20 pm

Xin hat geschrieben: Nein. Dein String ist eine Zeile( char [] ), argv sind viele Zeilen ( char [] [] entspricht char * [] entspricht char ** ).
Xin hat geschrieben:
Monkey101 hat geschrieben: Hatte sowas in die Richtung probiert...scheint aber nicht zu funktionieren.

Code: Alles auswählen

while (argv[1][k] != '\0'){
		st[k]=argv[1][k];
		k++;

	}
Das funktioniert nur beim ersten Array und da ist das Ziel etwas, was kein digit ist.
Beim zweiten Operanden brauchst Du für st und argv[1] unterschiedliche Indizes.
Das sollte noch nicht die Schleife werden die die Operanden mit isdigit() rausholt.
Sollte der Versuch sein den Inhalt von argv[1][] in einen anderen String (st) zu schreiben.
Die Idee war: (Aufruf mit "rechner 5+6")
argv[0][x] = Die erste Zeile mit x Spalten...also das Wort "rechner". (argv[0][2]="c")
argv[1][x] = Die zweite Zeile mit x Spalten...also "5+6" (argv[1][2]="6")

Jetzt sollte er mit der Schleife die Spalten von Zeile 2. durchgehen (also nur 1 Zeile sich angucken) und diese in den einzeiligen Array st[] speichern.

Sodass am Ende st[]=5+6 ist (st[2]="6").

So wollt ich das Dimensionsproblem was du weiter oben angesprochen hast umgehen weil ja nur 1 Zeile von dem Mehrzeiligen Array genommen und immer nur auf einen Char dieses Arrays zugegriffen wird.
Sodass am Ende der Mehrdimensionale Array auf 1. Dimension gekürzt wurde und ich das dann in einen anderen eindimensionalen kopieren kann.

Vom Prinzip her holt der sich quasi aus der Matrix 1 char und speichert den in nem anderen Array....so zumindest die Idee.

Darauf das ich beim 2. Operanden 2 verschiedene Indizes brauche hatteste mich gestern schon hingewiesen.^^

Code: Alles auswählen

 while (isdigit (st[i])){ // 2. Array mit den folgenden Ziffern
      ch2[j]=st[i];
      i++;
      j++;
   }
So hatte ich das bei meinem Program gelöst gehabt.

mfg Monkey101

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

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Fr Sep 13, 2013 2:28 pm

Monkey101 hat geschrieben: So wollt ich das Dimensionsproblem was du weiter oben angesprochen hast umgehen weil ja nur 1 Zeile von dem Mehrzeiligen Array genommen und immer nur auf einen Char dieses Arrays zugegriffen wird.

Code: Alles auswählen

char * st = argv[1];
Du kopierst den Zeiger auf den ersten Buchstaben (also der Zeiger auf die '5'), nicht den Text(!), so dass Du mit st genauso arbeiten kannst, wie mit argv[1].
Du willst ja nur lesen, da brauchst Du den Text nicht zu kopieren (Kopieren müsstest Du allerdings mit einer While-Schleife machen, wie Du es richtig angedeutet hast - oder mit strcpy()).
Monkey101 hat geschrieben:Darauf das ich beim 2. Operanden 2 verschiedene Indizes brauche hatteste mich gestern schon hingewiesen.^^
Schön, dass es gelesen wurde. :-)

Ich hatte es halt noch nicht umgesetzt gesehen.
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.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Fr Sep 13, 2013 2:40 pm

Vielen vielen vielen Dank es klappt! :D

Hatte nicht gerallt das ich wenn ich nen pointer auf nen array lege mit [] auch über den Pointer auf die Arrayteile zugreifen kann.
Wahrscheinlich wär ich aber auch nie auf die Idee gekommen einfach nen pointer auf die Zeile zu legen^^.

Dann noch kurz als Bonus...wie müsste ich denn meine Schleife ändern damit das richtig funktioniert?

mfg Monkey101

Antworten