Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/10/2007, à 20:31

DrDam

questions en C

Voilà, je me remet à programmer en C (console ... de base quoi ...) ...

Alors je vais me servir de ce post pour poser mes questions au fur et à mesure qu'elles viennent ...

Donc en voila une premiere:

dans un bout de code je demande à l'utilistateur de saisir un nombre, comment je fait pour verifier qu'il à bien saisie quelquechose de numérique ( "12" et pas "bobo" ) ?
LA question se porte sur le type de donnée, "int" VS "char"

Dernière modification par DrDam (Le 12/10/2007, à 20:50)


Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin

Hors ligne

#2 Le 12/10/2007, à 21:12

DrDam

Re : questions en C

oui ... mais bon, et comment on fait un contrôle automatique :

voila un bout de code :

for(i=0;i=10;i++)
      {
      printf("veuillez saisir un nombre?");
      scanf(%d,&Nb[i]);

      if (NB[i] pas un nombre) ???? <-- c'est la que je ne sais pas comment faire
          {
          printf("Veuillez saisir un nombre");
          i--;
          }

      }

le problème est que si le type saisie un chiffre, la boucle par en sucette... donc je voudrais faire un controle et si il ne rentre pas un nombre afficher le message d'erreur


Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin

Hors ligne

#3 Le 12/10/2007, à 21:26

gadjou

Re : questions en C

Différentes implementaion d'une fonction "parseint". En plus c'est trés didactique.

Hors ligne

#4 Le 12/10/2007, à 22:19

Arkenstone

Re : questions en C

Ceci pourrait peut être t'intéressé:
http://www.siteduzero.com/tuto-3-11181-1-realiser-des-saisies-securisees-grace-a-fgets.html


L'espoir est un premier pas vers la déception.

Hors ligne

#5 Le 12/10/2007, à 22:33

kamou

Re : questions en C

une solution serai d'utiliser un scanf (mais c'est pas recommandé....scanf est trop compliqué a utilser...)

si tu utilise scanf avec un %d et que tu rentre "bobo" scanf va retourner une erreur....

je te conceil avant d'attaquer de lire ceci: http://xrenault.developpez.com/tutoriels/c/scanf/

Hors ligne

#6 Le 12/10/2007, à 22:40

chcamier

Re : questions en C

Bonjour,

Pourquoi ne pas utiliser la fonction de bibliotheque standard "strtol" ou "strtoul". Voici un petit exemple fortement documenté de code qui met en oeuvre deux fonctions :

- test_unombre qui utilise la fonction strtoul
- test_snombre qui utilise la fonction strtol

Ces fonctions verifie qu'une chaine de caractere contient bien un nombre decimal, signe pour test_snombre ou non signe pour test_unombre.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/*
 * test_snombre: Pour un nombre signe (pouvant commencer par un '-' ou
 *               un '+'.
 * Arguments :
 *	nombre : chaine de caractere terminee par un caractere NULL.
 *	valeur : pointeur sur un entier long (long) pour retourner la
 *		 valeur si non NULL.
 *
 */

int
test_snombre(const char *nombre, long *valeur)
{
	char *ptr;
	long  val;

	/*
	 * La fonction de bibliotheque standard "strtol" convertit une
	 * chaine de caractere en un entier signe pour une base donnee
	 * (ici 10).
	 *
	 * Dans le cas ou la chaine de caractere n'est pas un nombre,
	 * le pointeur sur le premier element qui n'est pas un nombre
	 * (ptr qui est passe par adresse) contient l'adresse du
	 * premier caractere qui n'a put etre interprete.
	 */
	val = strtol(nombre, &ptr, 10);

	/*
	 * Si ptr n'est pas NULL, il y a erreur
	 */
	if(ptr != NULL && *ptr != '\0' && *ptr != '\n')
		return -1;

	/*
	 * Si valeur n'est pas un pointeur NULL, on retourne la valeur
	 * qui a ete determinee par la fonction strtol.
	 */
	if(valeur != NULL)
		*valeur = val;

	return 0;
}

/*
 * test_snombre: Pour un nombre non signe (forcement positif)
 * Arguments :
 *	nombre : chaine de caractere terminee par un caractere NULL.
 *	valeur : pointeur sur un entier long non signe (unsigned long)
 *		 pour retourner la valeur si non NULL.
 *
 */

int
test_unombre(const char *nombre, unsigned long *valeur)
{
	char          *ptr;
	unsigned long  val;

	/*
	 * Au cas ou le nombre entre est negatif, strtoul donne le
	 * nombre positif correspondant. Ce qui est un defaut de
	 * strtoul au moins dans la version gnu de la libc (je vais
	 * tester sur mon OpenBSD.
	 * On balaie les blanc en debut de chaine et on verifie que le
	 * premier caractere n'est pas un moins.
	 */

	while(isspace(*ptr)) ptr++;
	if(*ptr == '-' || *ptr == '\0')
		return -1;

	/*
	 * La fonction de bibliotheque standard "strtoul" convertit une
	 * chaine de caractere un en entier non signe pour une base
	 * donnee (ici 10).
	 *
	 * Dans le cas ou la chaine de caractere n'est pas un nombre,
	 * le pointeur sur le premier element qui n'est pas un nombre
	 * (ptr qui est passe par adresse) contient l'adresse du
	 * premier caractere qui n'a put etre interprete.
	 */
	val = strtoul(nombre, &ptr, 10);

	/*
	 * Si ptr n'est pas NULL, il y a erreur
	 */
	if(ptr != NULL && *ptr != '\0' && *ptr != '\n')
		return -1;

	/*
	 * Si valeur n'est pas un pointeur NULL, on retourne la valeur
	 * qui a ete determinee par la fonction strtol.
	 */
	if(valeur != NULL)
		*valeur = val;

	return 0;
}


int
main(int ac, char **av)
{
	static char buffer[100];

	long          vs;
	unsigned long vu;

	while(fgets(buffer, sizeof(buffer) - 1, stdin) != NULL)
	{
		if(test_unombre(buffer, &vu) == 0)
			printf("Vous avez entre le nombre positif %u\n", vu);
		else if(test_snombre(buffer, &vs) == 0)
			printf("Vous avez entre le nombre negatif %d\n", vs);
		else
			printf("%s: n'est pas un nombre\n", buffer);
	}
	return 0;
}

En esperant avoir eclaire ta lanterne.
Cordialement CC

Hors ligne

#7 Le 13/10/2007, à 08:40

nicolas.sitbon

Re : questions en C

pas besoin de sortir l'artillerie lourde ...

#include <stdio.h>

int main(void)
{
   int result,
        ret;
   do
   {
      puts("entrer un nombre :");
      ret = scanf("%d", &result);
      scanf("%*[^\n]");
      getchar();
   }while(ret != 1);

   printf("\nvoici votre nombre : %d\n", result);
   getchar();
   return 0;
}

Hors ligne

#8 Le 13/10/2007, à 10:51

DrDam

Re : questions en C

Merci de votre aide ... c'était un peu lourd à digéré ... mais bon ...

Seconde question :

Quel est la commande system pour effacer la console (à utilisé en C et sous linux)? system (cls) ?


Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin

Hors ligne

#9 Le 13/10/2007, à 10:56

kamou

Re : questions en C

clear pas cls

Hors ligne

#10 Le 13/10/2007, à 11:01

DrDam

Re : questions en C

merci


Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin

Hors ligne