myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   C int aus char zeigervektor (https://mygully.com/showthread.php?t=1998816)

susay 23.02.10 14:15

C int aus char zeigervektor
 
Ich habe mit strtok erfolgreich ein Zeile in eine Struktur eingelesen.
Jetzt benötige ich die tokens noch für einige andere Sachen und fische mir aus den tokens noch ein paar heraus von denen ich ein paar der Infos gleich weiterverarbeite.
Da ich nicht weiss an welcher Stelle sie kommen sammle ich sie mir mit einer if Bedingung auf.
Soweit so gut. Aber mit diesem Zeiger char habe ich nur ärger.
An einer Stelle brauche ich die Zahl die an einer bestimmten Stelle kommt. Aber das Zeichen lässt sich mit atoi nicht umwandeln. Kann mir jemand helfen?
Mit dem Fehler kann ich so recht nichts anfangen.
178, 31 Type error in argument 1 to `atoi'; found 'char' expected 'pointer to const char'.

Code:

char *tokenk,*tokenv;
        if (tokenk[3] == 'B')
        {
                while (a<=n)
                {
                        if (atoi(tokenk[2]) == a)
                                SetTableCellVal(tabPanelDATA, TABDATA_TABLEDATA, MakePoint (a, 4), tokenv);
// Tabelle in CVI tut aber für den Fehler nichts zur Sache restlicher Code ist C

                        ++a;
                }
               
               
          }


grieche1705 23.02.10 18:37

atoi kann nur die ganze char variable umwandeln du müsstest ihn einfach in eine zweite char-variable kopieren ( denk an das abschließende \0, musst du hinzufügen) und dann müsste es eigentlich funtkionieren hatte selbst auch so ein Problem gehabt

urga 23.02.10 18:51

oder (tokenk[2] - '0') == a

susay 24.02.10 07:52

Vielen Dank ich habe die Lösung von Urga gewählt. Könnte mich ärgern habe so lange an dem Problem gehangen und die Lösung ist so einfach xD

Aber jetzt hat sich ein weiteres Problem aufgetan und zwar funktioniert das ganze nicht wenn die Zahl zweistellig ist.
Das hieße die Zahl wäre ja dann von tokenk[2-3] und der Buchstabe wäre dann auf der Stelle 4.
Was kann ich da machen?

susay 24.02.10 13:55

Ok ich habe selber eine Lösungh gefunden aber diese ist für meinen Geschmack einen Zacken zu kompliziert:
Code:

char *seach={"1234567890"};
int a=1;
                        if (memchr(seach, tokenk[3], 10) != NULL)
                        {
                                b=tokenk[4];
                                strncpy(c ,tokenk+2, 2 );
                        }
                        else
                        {
                                b=tokenk[3];
                                strncpy(c ,tokenk+2, 1);
                        }
                        c[2]=NULL;
                                switch(b)
                        {
                                case 'B':
                                        while (a<=n)
                                        {
                                                if (atoi(c) == a)
                                                {
                                                        SetTableCellVal(tabPanelDATA, TABDATA_TABLEDATA, MakePoint (a, 4), tokenv);
                                                        break;
                                                }
                                                ++a;
                                        }
... }


urga 24.02.10 19:38

lol, viel zu kompliziert :)
strtok() hat doch deine zeile in spalten zerstückelt.

angenommen die aktulle spalte steht in char* s;
und s[i] sei die erste digit.

s[i+n] der buchstabe. n unbekannt.

Code:

int findNonDigit (char *s, int i) {
 while (isdigit(s[i])) i++;
 if (s[i] == '\0') {
  printf ("hier stimmt was nicht!\n");
  exit (-1);
 }
 return i;
}
....
....
int n = findNonDigit (s, i);
char c = s[i+n];
s[i+n] = '\0';
int zahl = atoi (s + (char*) i);

c ist schon geil ;) gerade was sowas angeht.

susay 26.02.10 13:43

Ah ok isdigit kannte ich noch nicht.
Jetzt sieht alles wie folgt aus:
Code:

                b=tokenk[3];
                a=1;
                d= atoi(tokenk+2);
                if (isdigit(tokenk[2]) || isdigit(b))
                {
               
                        if (isdigit(tokenk[3]))
                        {
                                b=tokenk[4];

                        }
                        switch(b)
                        {
                                case 'R':        SetTableCellVal(tabPanelDATA, TABDATA_TABLEDATA, MakePoint (d, 3), tokenv);
                                case 'B':        SetTableCellVal(tabPanelDATA, TABDATA_TABLEDATA, MakePoint (d, 4), tokenv);
                                case 'N':        SetTableCellVal(tabPanelDATA, TABDATA_TABLEDATA, MakePoint (d, 1), tokenv);
                                case 'S':        SetTableCellVal(tabPanelDATA, TABDATA_TABLEDATA, MakePoint (d, 2), tokenv);
                                default:        break;

                        }       
                }


urga 26.02.10 18:12

poste doch mal die ganze funktion. ich glaube die kann man optimieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.