Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3184 connectés 

  FORUM HardWare.fr
  Programmation
  C

  _itoa_s

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

_itoa_s

n°1446971
bb138
La vie est belle ...
Posté le 25-09-2006 à 09:32:22  profilanswer
 

Bonjour,
 
Je dois travail sous MS-Windows et faire, entre autre, des conversions d'entiers vers des chaînes de caractères.
Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s.
D'après la msdn :

Returned Value:
Zero if successful; an error code on failure....

(cf. http://msdn2.microsoft.com/en-us/library/0we9x30h.aspx)
Donc, avec cette fonction, je ne suis pas obligé de surdimensionner mon buffer cible et éventuellement, suivant le code de retour, je peux le redimensionner... Mais là mes doux rêves s'envolent car dès que je regarde d'un peut plus près _itoa_s qui finit par l'appel à

Code :
  1. static errno_t __stdcall xtox_s(
  2.    unsigned long val,
  3.    TCHAR *buf,
  4.    size_t sizeInTChars,
  5.    unsigned radix,
  6.    int is_neg
  7. )

définie dans xtoa.c (VC8\crt\src\), le seul return retourne 0 et il y a un test assez sympa :

Code :
  1. /* Check for buffer overrun */
  2. if (length >= sizeInTChars)
  3. {
  4.    buf[0] = '\0';
  5.    _VALIDATE_RETURN_ERRCODE(length < sizeInTChars, ERANGE);
  6. }


Du coup, je me demande si c'est moi qui ne comprend rien ou bien s'il y a une erreur dans l'implémentation...
Merci de vos lumières.

mood
Publicité
Posté le 25-09-2006 à 09:32:22  profilanswer
 

n°1446984
Elmoricq
Modérateur
Posté le 25-09-2006 à 09:54:16  profilanswer
 

bb138 a écrit :


Je dois travail sous MS-Windows et faire, entre autre, des conversions d'entiers vers des chaînes de caractères.
Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s.


 
Pas standard. Le plus simple est d'utiliser snprintf().
 
Exemple :

#include <stdio.h>
#include <stdlib.h>
 
/* juste pour l'exemple */
#define TAILLE_MAX 256
 
int main(void)
{
   int nombre = 123;
   char buffer[TAILLE_MAX];
 
   snprintf(buffer, TAILLE_MAX, "%d", nombre);
 
   printf("Nombre converti en chaine : %s\n", buffer);
 
   return EXIT_SUCCESS;
}


 
 
 

n°1447012
bb138
La vie est belle ...
Posté le 25-09-2006 à 10:58:33  profilanswer
 

Merci tu as absolument raison, snprintf fonctionne tout à fait comme il faut pour mon problème.
 
Saurais-tu par ailleurs si les fonctions dites "sécurisées" (exemple : _snprintf_s) sont juste des histoires Microsoft ou existent-elles aussi sous GNU/Linux par exemple ?

n°1447017
bb138
La vie est belle ...
Posté le 25-09-2006 à 11:06:24  profilanswer
 

Finalement après avoir lancé ma machine virtuelle, il ne semble pas y avoir de fonction "sécurisée", donc encore une histoire de Microsoft...

n°1447128
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-09-2006 à 13:46:44  profilanswer
 

bb138 a écrit :

Je dois travail sous MS-Windows et faire, entre autre, des conversions d'entiers vers des chaînes de caractères.
Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s.


Mauvais choix. Le standard (C90) dispose de sprintf(). Un version plus sûr est disponible avec C99 : snprintf(). Ne pas se laisser endormir par les sirènes microsoftiennes...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1447467
Sve@r
Posté le 26-09-2006 à 11:04:39  profilanswer
 

bb138 a écrit :

Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s. D'après la msdn...


Fonctions "sécurisées" de la msdn ???  
J'ai plus confiance en "gets()" qu'en toutes les fonctions sécurisées de Micro$oft [:rofl]

Message cité 1 fois
Message édité par Sve@r le 26-09-2006 à 11:06:47

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1447785
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-09-2006 à 18:23:16  profilanswer
 

Sve@r a écrit :

Fonctions "sécurisées" de la msdn ???  
J'ai plus confiance en "gets()" qu'en toutes les fonctions sécurisées de Micro$oft [:rofl]


Arf, faut pas tomber non plus dans la caricature. Depuis que Microsoft fait des développements en interne avec une véritable politique de qualité, il y a de bonnes choses. Et puis ne pas confondre le département outils et langages avec le département bureautique. Rien à voir...
 
Ceci-dit, ce n'est pas Microsoft tout seul d'imposer sa vision sécurisée du C (warnings à la compilation), mais plutôt de faire évoluer la norme (la bibliothèque) ou de créer son langage (ce qu'il a été fait avec C#).


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  _itoa_s

 

Sujets relatifs
itoa() avec C++ 
Plus de sujets relatifs à : _itoa_s


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)