2008-10-22 8 views
3

J'ai une chaîne (char) et je veux en extraire des nombres.Conversion d'une chaîne de nombres en entiers

J'ai donc chaîne: 1 2 3 4 /0
Et maintenant, je veux des variables, donc je peux les utiliser comme entier: a=1, a=2, a=3, a=4

Comment puis-je faire cela?

+0

La difficulté, dans le problème (devoirs?) Est de le comprendre ... Je suggère d'essayer de le reformuler. Peut-être que la fonction atoi() peut vous aider aussi. – PhiLho

Répondre

2

Si la chaîne contient toujours 4 numéros délimités par des espaces, il pourrait être fait avec sscanf:

sscanf(string, "%d %d %d %d", &a, &b, &c, &d); 

Si le nombre de chiffres varie, vous aurez alors besoin d'analyser la chaîne.

Veuillez clarifier votre question en conséquence.

+0

Veuillez noter que sscanf() renvoie le nombre de spécificateurs convertis et assignés avec succès (il ne compte pas ceux qui ont été supprimés en utilisant la notation '% * d'). –

2

sscanf() peut le faire.

#include <stdio.h> 

int main(void) 
{ 
    int a, b, c, d; 
    sscanf("1 2 3 4", "%d %d %d %d", &a, &b, &c, &d); 
    printf("%d,%d,%d,%d\n", a, b, c, d); 
} 
3

Comme d'autres l'ont noté, si vous connaissez le nombre de nombres à attendre, sscanf est la solution la plus simple. Sinon, les éléments suivants esquissent une solution plus générale:

D'abord marquer la chaîne par des espaces. La méthode standard C est pour cette strtok():

char* copy; 
char* token; 

copy = strdup(string); /* strtok modifies the string, so we need a copy */ 

token = strtok(copy, " "); 
while(token!=NULL){ 
    /* token now points to one number. 
    token = strtok(copy, " ");  
} 

convertir ensuite la chaîne en entiers. atoi() fera cela.

+0

ne pas oublier de nettoyer la copie créée. – Tetha

+0

Je recommanderais d'utiliser strtol() au lieu de atoi() car il a une gestion d'erreur bien définie. De plus, strdup() n'est pas une fonction standard de C (c'est dans POSIX), bien que l'implémentation de votre propre strdup() soit triviale. Bien sûr, la copie devrait être libre() après. – Chris

4

Les réponses données jusqu'à présent sont correctes, à condition que votre chaîne soit formatée comme vous le souhaitez. Vous devriez toujours vérifier la valeur de retour de sscanf pour vous assurer que les choses ont bien fonctionné. sscanf retourne le nombre de conversions effectués avec succès, dans le cas ci-dessus 4.

if (4 != sscanf(buf, "%d %d %d %d", &a, &b, &c, &d)) 
{ 
    /* deal with error */ 
} 

Si buf était "1 2 3" ou "1 2 a b" ou quelque chose, sscanf renverrait une nmemb.

Questions connexes