10
votes

Existe-t-il un équivalent Strtol qui ne nécessite pas une chaîne de terminaison null?

existe-t-il une fonction C standard C similaire à Strtol, qui prendra une chare * et une longueur pour une chaîne non nulnulée?

Je sais que je pourrais copier la chaîne dans une région désignée des nuls, mais pour des raisons d'efficacité indésirables.

merci.


2 commentaires

Bonjour, je viens du futur. Croiriez-vous que 10 ans plus tard, il n'y a toujours pas de solution standard qui ne nécessite pas de copier la chaîne sur un tampon temporaire? Et rappelez-vous que Simpsons épisode a été diffusé en 2000 où Trump était le président des États-Unis? Vous ne le croirez pas si je vous disais ...


@ user1593842 Si vous êtes prêt à utiliser la bibliothèque standard C ++, en.cppreference.com/w / cpp / utilitaire / de_chars est une solution décente.


4 Réponses :


2
votes

Strntol est probablement ce que vous êtes après ... ce n'est pas standard c, cependant.


0 commentaires

4
votes

Aucune fonction de ce type dans la bibliothèque standard. Vous devrez soit utiliser la méthode tampon temporaire, soit écrire votre propre fonction à partir de zéro.


0 commentaires

1
votes

Si vous êtes que em> pressé pour une efficacité, vous pouvez probablement motiver le temps d'écrire et de déboguer le vôtre.

Mais: faites-le simplement avec une copie; Vous avez probablement une limite supérieure pendant combien de temps la chaîne peut être (un chiffre décimal qui convient à un long code> a une limite supérieure stricte sur sa longueur maximale), de sorte que vous pouvez avoir un tampon statique. Ensuite, profilez toute votre application et voyez si la copie / la conversion est vraiment un goulot d'étranglement. Si c'est vraiment, alors vous savez que vous devez écrire votre propre. P>

Voici un point de départ rugueux (non testé, écrit de navigateur): p>

long limited_strtol(const char *string, size_t len)
{
  long sign = 1;
  long value = 0;

  for(; len > 0 && *string == '-'; string++, len--)
    sign *= -1;

  for(; len > 0 && isdigit(*string); string++, len--)
  {
   value *= 10;
   value += *string - '0';
   len--;
   string++;
  }
  return sign * value;
}


1 commentaires

Vous devez convertir en non signé Char avant de passer à isdigit



3
votes

Pour répondre à votre question: Non, il n'y a pas de fonction standard, mais il est assez simple d'écrire votre propre: xxx


0 commentaires