C: Hilfe bei Programm (strings umwandeln)
- 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)
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.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C: Hilfe bei Programm (strings umwandeln)
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:
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;
}
}
}
- 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)
Guter Plan. Der Aufruf müsste mitMonkey101 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.
Code: Alles auswählen
"Praktikum Auf.5" 6+9
argv1 enthält nur "6+9", nicht den Programmnamen. Der steht in argv[0]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.
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.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?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C: Hilfe bei Programm (strings umwandeln)
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
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
- 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)
Ja - und Nein. ^^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: 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".
Sowas gibt's in C nicht. Du musst eine Schleife schreiben, die solange kopiert, wie Du Ziffern findest: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).
Code: Alles auswählen
for( unsigned int i = 0; isdigit( argv[1][i] ); i++ ) firstOperand[i] == argv[1][i];
Du kannst mit argv[1] genauso umgehen wie mit st zuvor. Beide haben den gleichen Datentyp.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
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C: Hilfe bei Programm (strings umwandeln)
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.
mfg Monkey101
edit: Ach bei dem Aufruf handelt es ich um nen 2. dimensionales Array...
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++;
}
edit: Ach bei dem Aufruf handelt es ich um nen 2. dimensionales Array...
- 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)
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 ** ).
Das funktioniert nur beim ersten Array und da ist das Ziel etwas, was kein digit ist.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++; }
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C: Hilfe bei Programm (strings umwandeln)
Xin hat geschrieben: Nein. Dein String ist eine Zeile( char [] ), argv sind viele Zeilen ( char [] [] entspricht char * [] entspricht char ** ).
Das sollte noch nicht die Schleife werden die die Operanden mit isdigit() rausholt.Xin hat geschrieben:Monkey101 hat geschrieben: Hatte sowas in die Richtung probiert...scheint aber nicht zu funktionieren.Das funktioniert nur beim ersten Array und da ist das Ziel etwas, was kein digit ist.Code: Alles auswählen
while (argv[1][k] != '\0'){ st[k]=argv[1][k]; k++; }
Beim zweiten Operanden brauchst Du für st und argv[1] unterschiedliche Indizes.
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++;
}
mfg Monkey101
- 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)
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 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()).
Schön, dass es gelesen wurde.Monkey101 hat geschrieben:Darauf das ich beim 2. Operanden 2 verschiedene Indizes brauche hatteste mich gestern schon hingewiesen.^^

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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C: Hilfe bei Programm (strings umwandeln)
Vielen vielen vielen Dank es klappt!
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

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