isdigit

macropode

Erfahrenes Mitglied
Hallo muß mal wieder streßen.
und zwar will ich aus einem string nummerische werte auslesen.
jedoch gibt er mir irgentwas anderes und einen speicherzugrifffehler.
was mache ich falsch?
Code:
int *zahlverk(char *wert, char *cklampts)
     89 {
     90  	 int *erg;
     91  	 int i = 1;
     92
     93  	 for(; *cklampts!='\0' ;wert--)
     94  	 {
     95
     96
     97
     98   	  if (isdigit(*cklampts))
     99   		  {
    100     			  erg = erg + *cklampts * i;
    101      		 i = i*10;
    102     		}
    103    		 else
    104   		  {
    105    			 return erg;					
    106
    107   		  }
    108	   }
    109 	}
 
Oder du schreibst dir ne Funktion die das übernimmt.

Die ato gehen nämlich glaub ich bloß bis float. Is auch nicht so ein Aufwand:

- du brauchst ne Case-Abfrage für die Zeichen:
- du gehst den String von vorne nach hinten durch:
- du musst die STellenwertigkeit hochzählen
- zahl = zahl + pow(10, stellenwertigkeit)*stellenwert
 
moin


Das Problem ist folgendes:
Und zwa arbeitest du immer mit dem kompletten String der in *cklampts ist.
Jedoch kannst du z.B. mit isdigit immer nur ein Zeichen überprüfen.

Anstatt isdigit zu benuzen, kannst du es auch folgendermaßen machen:
Code:
if( zeichen >= '0' && zeichen <= '9') ....

Wichtig ist halt das du jeses Zeichen in *cklampts einzeln behandelst.

Den Pointer vor deinem Funktionsnamen soltest du auch weglassen, wenn du ihn nciht dringend brauchst.


mfg
umbrasaxum
 
Code:
      1 // parsen der berechnung nach thermen
      2 // 1. klammerebenen sondieren
      3
      4 #include <stdio.h>
      5 #include <string.h>
      6 #include <ctype.h>
      7 #include <stdlib.h>
      8
      9 char *fklauf(char *buf);
     10 char *fklzu(char *buf);
     11 char *copy(char *auf, char *zu);
     12 char *punkt_rechnung(char *cklamptp);
     13 int *zahlverk(char *wert, char *cklampts);
     14
     15 char cbuf[255];             // nimmt berechnung komplett auf ....
     16 char *cptr;               // zeigt auf aktuelle position in berechnung ....
     17 char *cklamptr;
     18
     19
     20 int main (int argc, char *argv[])
     21 {
     22   int i = 0;
     23   cklamptr = 0;
     24   char *klzu;
     25   char *klauf;
     26   char *klammerg;
     27
     28
     29   for( ; (cptr = gets(cbuf)) != NULL; )
     30   {
     31
     32
     33   printf("%s\n", (klzu = fklzu( cbuf )));                     //findet die erste geschloßene klammer
     34   printf("%s\n", (klauf = fklauf(klzu )));                    // geht zurück bis zur passenden geöffntete klammer
     35   char cklamm[klzu-klauf];
     36   printf("%s\n", (cklamptr = memcpy(cklamm, klauf, klzu-klauf)) );          // kopiert den klammerterm in cklamptr
     37   printf("%s\n", (klammerg = punkt_rechnung(cklamptr)) );                 // multiplikationsergebnis in klammerterm
     38   }
     39
     40
     41 }
     42
     43 char *fklzu(char *buf)
     44 { // buf zeigt auf string nach klammer zu zu untersuchen
     45   // return zeigt erste geschlossen klammer an
     46
     47   for( ; buf++; )
     48   {
     49     if(*buf =='\0') return NULL;
     50     if(*buf ==')')
     51     {
     52       *buf = 'k';
	53       return buf;
     54     }
     55   }
     56 }
     57
     58 char *fklauf(char *buf)
     59 { // buf zeigt auf string nach klammer auf zu untersuchen
     60   // return zeigt auf erste gefundene klammer auf
     61
     62
     63   for( ; buf--; )
     64   { // los gehts mit erstem zeichen
     65     if( *buf == '\0' ) return NULL;
     66     if( *buf == '(' )
     67     {
     68     *buf = 'k';
     69     return buf;
     70     }
     71   }
     72 }
     73
     74 char *punkt_rechnung(char *cklamptp)
     75 {
     76   char *multi;
     77   int *zahlvor;
     78
     79
     80
     81   printf("%s\n", (multi = strchr(cklamptp, '*')) );
     82   if (multi != NULL)
     83   {
     84   printf("%s\n", (zahlvor = zahlverk(multi, cklamptp)) );
     85   }
     86 }
     87
     88
     89 int *zahlverk(char *wert, char *cklampts)
     90 {
     91   int *erg;
     92   int i = 1;
     93
     94
     95   for(; *cklampts == '\0'; wert--)
     96   {
     97     int w = atoi(*cklampts);
     98
     99     if (isdigit(w))
    100     {
    101       erg = erg + w  * i;
    102       i = i*10;
    103     }
    104     else
 105     {
    106     return erg;
    107
    108     }
    109   }
    110 }
    111

Danke erstmal für den tip.

Habe mal das gesamte prog gepostet da ich das problem des Speicherzugriffehlers nicht finden kann!

bitte helft mir wo ist der Fehler?
 
moin


Da sind jede Menge unstimmigkeiten drin.

Code:
char *klzu;
char *klauf;
......
char cklamm[klzu-klauf];

Das geht schonmal garnciht! ICh kann das mit meinem neuren Compiler nciht mal Compilieren.


Oder hier:
Code:
char cbuf[255];
.....
char *fklzu(char *buf)
{ // buf zeigt auf string nach klammer zu zu untersuchen
	// return zeigt erste geschlossen klammer an

	for( ; buf++; )
	{
		if(*buf =='\0') return NULL;

Das ist das selbe Problem wo ich in meinem letzzten Beitrag schon drauf hingewiesen hab. cbuf ist bis zu 255 Zeichen groß, du vergleichst aber den kompletten String mit einem einigen Zeichen.

Und davon sind da noch jede Menge mehr Probleme drin.
Das sind alles nciht direkt Fehler aber starke Fehlerquellen.

Warum schreibst du vor jede Funktion nen Pointer?


mfg
umbrasaxum
 
der pointer zeigt doch auf den anfang bzw. auf die jeweilige stelle des string von wo ich arbeiten will (denke ich zumindest)!
 
also das ist das was bei mir rauskommt.
mich persönlich stört erstmal der speicherzugriffsfehler!

Code:
prakt@praktt:~> ./a.out <text.txt
k:(7+5*5-2*8)
k6*3-2+1k:(7+5*5-2*8)
k6*3-2+1,@
*3-2+1,@
*
Speicherzugriffsfehler
 
moin


Nein das ist falsch.
Und beantworte mir dochmal meine Frage wegen den Pointern vor den Funktionen.


mfg
umbrasaxum
 
Zurück