Langage C: Comment obtenir le numéro de chaîne via sscanf?
Récemment, j'ai besoin d'extraire un nombre à partir d'une chaîne, mais sur de très vieux C avec des fonctions comme strtok
ne sont pas pris en charge. Je préfère sscanf
, mais je ne peux pas le comprendre.
Notez que l'entier est dans endroit aléatoire (défini par l'utilisateur).
En général c'est ce que je veux happan comme un exemple:
Input:
char * string = "He is 16 years old.";
Output:
16
Bonjour et bienvenue à stackoverflow.com. Veuillez prendre le temps de lire les pages d'aide, en particulier les sections nommé "Quels sont les sujets que pouvez-vous nous parler ici?" et "Quels sont les types de questions devrais-je éviter de poser la question?". Et surtout, merci de lire le Dépassement de Pile question de liste. Vous pouvez également apprendre ce qu'est un SSCCE est.
"mais sur de très vieux C" - vous êtes un masochiste?
Jeu-Éditeur de la plate-forme ne supportent pas la version la plus récente de C ^^.
mes condoléances. eh bien, tant qu'il n'est pas un langage de base de la fonctionnalité, vous pouvez toujours prendre une implémentation de la partie manquante et l'utiliser.
"mais sur de très vieux C" - vous êtes un masochiste?
Jeu-Éditeur de la plate-forme ne supportent pas la version la plus récente de C ^^.
mes condoléances. eh bien, tant qu'il n'est pas un langage de base de la fonctionnalité, vous pouvez toujours prendre une implémentation de la partie manquante et l'utiliser.
OriginalL'auteur Lively | 2014-02-19
Vous devez vous connecter pour publier un commentaire.
Une combinaison de chiffres et de filtrage
sscanf()
devrait fonctionner.Travail supplémentaire nécessaire pour les nombres de débordement.
Un rythme plus lent, mais pédant méthode suit
isdigit
n'est malheureusement pas pris en charge aussi bien..isdigit()
supprimé.En fait j'ai essayé de procéder et a finalement fait str à la fonction int:
int strtoint(char source[]) { int multiplier = 1; int i, result; for (i=strlen(source)-1; i>=0; i--) { if(source[i] >= '0' && source[i] <= '9') { result = result + ((source[i]-'0') * multiplier); multiplier *= 10; } } return result; }
Pourrait aller dans le sens de la marche.
{ size_t i; int result = 0; for (i=0; source[i]; i++) { if(source[i] >= '0' && source[i] <= '9') { result = result*10 + source[i] - '0'; }
BTW: Votre code doit
int i, result=0;
.OriginalL'auteur chux
scanf essaie de correspondre à un modèle.... donc, si vous saviez que la chaîne a été "Il est de 16 ans." où 16 est un nombre entier vous souhaite à décoder.
( Je pense que votre chaîne d'entrée implique votre format est un peu de forme libre. Je suis en supposant que ses prévisible. )
sscanf
c'est aussi loin que vous pourriez obtenir de l'Animé (OP). Si vous êtes à l'acquisition de certains autres non-entrée standard, rien d'autre que "Il est x ans.",sscanf
ne le fera pas.La chaîne est donné comme exemple. Fondamentalement, l'utilisateur n'aura qu'à écrire chaîne aléatoire avec entier quelque part en elle.. Et la fonction de la sortie de ces entiers. Est-il même possible.. j'ai juste vu des questions similaires avec
sscanf
comme une réponse, mais pas d'explication sur commentsscanf
pourrait être utilisé.Généralement, les chaînes d'entrée se conformer à certaines convenu de la syntaxe. Si il est totalement gratuit et forme ensuite je voudrais écrire une routine de diviser la chaîne d'entrée entre l'espace blanc dans un tableau de petites chaînes. Puis suivez les étapes du tableau de l'appel de scanf sur chaque. Les Paramètres de la valeur renvoie le nombre %d dans l'exemple décodé pour un int (au maximum) dans notre exemple.
OriginalL'auteur AnthonyLambert
Pour commencer, vous devez savoir que le
strtok
fonction est assez ancienne. C'est dans la norme C89, mais probablement existé dans de nombreuses implémentations avant (par exemple en 4.3 BSD qui a été publié en 1986). En fait, lasscanf
fonction est probablement plus récente que lastrtok
fonction.Mais si vous avez une ancienne compilateur, et n'ont pas en réalité la
strtok
fonction, et votre chaîne d'entrée ne suit pas le format exact que vous avez dans la question, mais peut-être plus de forme libre (et donc ne peut pas vraiment utiliser le pattern-matching fonctionnalité desscanf
) ensuite, vous devez analyser la chaîne manuellement.Ce manuel d'analyse peut être assez simple, il suffit d'en boucle sur la chaîne jusqu'à ce que vous trouver un chiffre, puis recueillir tous les chiffres consécutifs lors de la construction du nombre. Une fois que vous obtenez un chiffre personnage, vous avez votre numéro. Bien sûr, ce sera seulement le premier numéro de la chaîne.
strtok
n'est pas pris en charge et même Dieu ne sais pas pourquoi. Tu veux dire convertir la chaîne en tableau et set de comparer si le premier caractère est 0 à 10, puis de retour.. si non passez à la prochaine?Oh mon dieu, je me sens vraiment désolé pour vous, alors! Mais oui, c'est l'essentiel.
Bien hehe @Joachim je dois t'habituer à faire cela. Semble, je vais créer une comparer entrée-sortie de la fonction par moi-même. Merci.
OriginalL'auteur Some programmer dude
OriginalL'auteur BLUEPIXY