Domanda

Ho questo codice:

#include <ctype.h> 

char *tokenHolder[2500];

for(i = 0; tokenHolder[i] != NULL; ++i){

         if(isdigit(tokenHolder[i])){ printf("worked"); }
.

Dove Tokenholder contiene l'ingresso di token di Char dall'ingresso utente che è stato tokenizzato tramite Getline e Strtok.Ottengo un errore Seg quando cerchi di utilizzare ISDigit sul tokenholder - e non sono sicuro del perché.

È stato utile?

Soluzione

Poiché tokenHolder è una matrice di char *, quando si indicizza tokenHolder[i], stai passando un char * a isdigit() e isdigit() non accettano i puntatori.

Probabilmente manca un secondo ciclo o hai bisogno:

if (isdigit(tokenHolder[i][0]))
    printf("working\n");
.

Non dimenticare la nuova linea.

Il tuo test nel ciclo è anche dispari; Normalmente scrivi "NULL Pointer" come 0 o NULL e non come '\0'; che si limita a fuorviare le persone.

Inoltre, è necessario prestare attenzione alle avvertenze del compilatore che stai ottenendo! Non pubblicare il codice che compila con avvertimenti, o (almeno) specificare ciò che gli avvertimenti sono così le persone possono vedere cosa ti sta dicendo il compilatore. Dovresti mirare a zero avvertimenti con il compilatore impostato su fussy.

Se si sta tentando di testare che i valori nell'array del token sono tutti i numeri, è necessario una funzione test_integer() che tenta di convertire la stringa in un numero e ti consente di sapere se la conversione non utilizza tutti i dati nel String (o potresti consentire spazi vuoti conducenti e finali). Le specifiche del problema non sono chiare esattamente su ciò che stai cercando di fare con i token stringa che hai trovato con strtok() ecc.

Per quanto riguarda il motivo per cui stai ricevendo il dump del core:

Il codice per la macro ISDigit () è spesso approssimativamente

#define isdigit(x) (_Ctype[(x)+1]&_DIGIT)
.

Quando si fornisce un puntatore, viene trattato come un offset molto grande (positivo o possibilmente negativo) a una serie di (solitamente) 257 valori, e poiché stai accedendo alla memoria fuori dai limiti, ottieni un errore di segmentazione. Il +1 consente di passare a EOF a isdigit() quando EOF è -1, che è il valore abituale ma non è obbligatorio. Le macro / funzioni come isdigit() prendono un carattere come unsigned char - solitamente nell'intervallo 0..255, quindi - o EOF come ingressi validi.

Altri suggerimenti

Stai dichiarando una matrice di puntatore a char , non una semplice matrice di just char .È inoltre necessario significare l'array o assegnarlo un po 'di valore in seguito.Se si legge il valore di un membro dell'array che non è stato inizializzato o assegnato a, stai invocando un comportamento indefinito.

char tokenHolder[2500] = {0};

for(int i = 0; tokenHolder[i] != '\0'; ++i){

     if(isdigit(tokenHolder[i])){ printf("worked"); }
.

Su una nota laterale, probabilmente stai trascurando gli avvertimenti del compilatore che ti dicono che il tuo codice potrebbe non essere corretto.isdigit prevede un int e un char * non è compatibile con int, quindi il tuo compilatore dovrebbe aver generato un avviso per questo.

È necessario / vuoi lanciare il tuo ingresso su unsigned char prima di passarlo su isdigit.

if(isdigit((unsigned char)tokenHolder[i])){ printf("worked"); }
.

Nella maggior parte dei regimi di codifica tipici, caratteri al di fuori della gamma USASCii (ad esempio, qualsiasi lettere con Umlauts, accenti, tombe, ecc.) Si presenterà come numeri negativi nel caso tipico che char è firmato.

Su come ciò causa un guasto del segmento: isdigit (insieme a islower, isupper, ecc.) Vengono spesso implementati utilizzando una tabella di bit-field e quando si chiama la funzione il valore che il passaggio viene utilizzato come indice inla tavola.Un numero negativo finisce per cercare di indicizzare (bene) fuori dal tavolo.

Anche se non l'ho inizialmente notato, hai anche un problema perché tokenHolder (probabilmente) non è il tipo che ti prevedi / previsto da utilizzare.Dall'aspetto del resto del codice, vuoi davvero definirlo come:

char tokenHolder[2500];
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top