# isdigit



## macropode (28. Februar 2005)

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?

```
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 	}
```


----------



## LordDeath (28. Februar 2005)

Hi

bevor du einen char einem int Wert zuweisen kannst musst du das ganzemit atoi parsen !


DarkGreetinx LordDeath


----------



## shutdown (28. Februar 2005)

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


----------



## Tobias K. (28. Februar 2005)

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:

```
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


----------



## macropode (28. Februar 2005)

```
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?


----------



## Tobias K. (28. Februar 2005)

moin


Da sind jede Menge unstimmigkeiten drin.


```
char *klzu;
char *klauf;
......
char cklamm[klzu-klauf];
```

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


Oder hier:

```
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


----------



## macropode (28. Februar 2005)

der pointer zeigt doch auf den anfang bzw. auf die jeweilige stelle des string von wo ich arbeiten will (denke ich zumindest)!


----------



## macropode (28. Februar 2005)

also das ist das was bei mir rauskommt. 
mich persönlich stört erstmal der speicherzugriffsfehler!


```
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
```


----------



## Tobias K. (28. Februar 2005)

moin


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


mfg
umbrasaxum


----------



## macropode (28. Februar 2005)

naja der pointer zeigt auf eine speicheradresse des string von wo an  ich arbeiten möchte!


----------



## Tobias K. (28. Februar 2005)

moin

?


```
char *fklauf(char *buf);
     ^
```

Wo zeigt der Pointer auf einen String?


mfg
umbrasaxum


----------



## macropode (28. Februar 2005)

übergebe in zeile 34:

 printf("%s\n", (klauf = fklauf(klzu )));

die speicheradresse der 1.geschlossen klammer an *buf
in der funktion *fklauf!


----------



## macropode (28. Februar 2005)

kann mir denn keiner helfen?

Inzwischen bin ich soweit das ich den speicherzugriffsfehler behoben habe. kann jedoch immernoch nicht den wert auslesen!


----------

