2010-04-29 7 views
-2
valeur d'entrée

123 - cette valeur est un entier, et valideComment formater entrée pour accepter uniquement valeurs entières

valeur d'entrée 1b23a - cette valeur est invalide

Comment détecter quelles valeurs sont valides et ne pas?

Voici mon code:

#include <stdio.h> 
#include <conio.h> 
void main() 
{ 
    char str1[5],str2[5]; 
    int num,num1,i; 
    num=0; 
    clrscr(); 
    printf("Enter the Number "); 
    scanf("%s",str1); 
    for(i=0;str1[i]!='\0';i++) 
    { 
     if(str1[i]>=48&&str1[i]<=56) 
      num=num1*10+(str[i]-48); 
     else 
     { 
      printf("The value is invalid "); 
     } 
    } 
    printf("This Number is %d",num); 
    getch(); 
} 
+1

Je suis désolé, euh, quoi? –

+0

Je pense que vous voulez dire: Comment dois-je valider un champ de saisie pour n'accepter que des entiers. ie: 123 est valide, 1b23a n'est pas valide – Luis

+1

Objective C est juste un langage de programmation - je suppose que vous parlez probablement du développement de Cocoa sur Mac ou du développement de CocoaTouch sur iPhone/iPad? –

Répondre

0
#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
char str1[5],str2[5]; 
int num,num1,i; 
num=0; 
clrscr(); 
printf("Enter the Number "); 
scanf("%s",str1); 
for(i=0;str1[i]!='\0';i++) 
if(str1[i]>=48&&str1[i]<=56) 
num=num1*10+(str[i]-48); 
else 
{ 
printf("The value is invalid "); 
} 
} 
printf("This Number is %d",num); 
getch(); 
} 
+2

J'ai inséré ce code à votre question. Vous pouvez supprimer cette réponse. – mouviciel

+0

Au contraire, vous pouvez absolument répondre à vos questions. Et si vous répondez à votre propre question, vous n'êtes PAS censé l'inclure dans votre question. C'est dans la FAQ quelque part les gens. – wds

1

S'il vous plaît voir this answer regarding use of strtol(). C'est un moyen sûr de convertir une entrée arbitraire que devrait être une représentation sous forme de chaîne d'un entier, tout en sauvegardant des octets "garbage" pour une analyse supplémentaire.

utilisant, votre code ressemblerait à quelque chose comme ceci:

#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#ifdef LINUX_VERSION 
#include <curses.h> 
#else 
#include <conio.h> 
#endif 

#define BUFF_SIZE 1024 

int main(void) 
{ 
    char str1[BUFF_SIZE], *garbage = NULL; 
    long num = 0; 

    printf("Enter the Number "); 
    scanf("%s",str1); 

    errno = 0; 

    num = strtol(str1, &garbage, 0); 
    if (errno) { 
     printf("The number is invalid\n"); 
     return 1; 
    } 

    printf("You entered the number %ld\n", num); 
    if (garbage != NULL) { 
     printf("Additional garbage that was ignored is '%s'\n", garbage); 
    } 
    getch(); 
    return 0; 
} 

Cela ne résout pas tout ce qui est discutable sur ce que vous avez publié, mais il devrait vous aider à descendre à un meilleur départ.

sortie est:

[email protected]:~$ ./t 
Enter the Number 1234abdc 
You entered the number 1234 
Additional garbage that was ignored is 'abdc' 

Compilé par:

gcc -Wall -DLINUX_VERSION -o t t.c -lcurses 

Je ne sais pas quelle plate-forme que vous utilisez, des corrections supplémentaires si au code peut être nécessaire.

-1

L'une des façons est d'utiliser sscanf et de vérifier qu'il n'y a aucun caractère suivant le nombre. Cela se fait plus facilement en ajoutant une %c à la fin et tester le code de retour, comme celui-ci:

const char *yourString = ...; 
int theValue, dummy; 
if (sscanf(yourString, "%d%c", &theValue, &dummy) == 1) { 
    // Was a pure number, parsed into 'theValue' 
} else { 
    // Either no number or had junk after it 
} 
+0

Je recommande sérieusement de ne pas utiliser sscanf pour quoi que ce soit. Vraiment. Recherchez "crash sscanf" et regardez toutes les pages retournées. "Le tutoriel de programmation C de GNU" (http://crasseux.com/books/ctutorial/index.html) dit: "La fonction sscanf est juste comme la fonction scanf parent obsolète, .... La fonction scanf est considérée comme dangereuse pour un certain nombre de raisons. " S'il-vous-plait, ne l'utilisez pas. – hlovdal

+0

@hlovdal: Vous êtes incompétent. Je n'ai pas recommandé 'scanf', mais plutôt' sscanf', et le cas auquel il est confronté (pas d'analyse de chaîne, de chaîne de format et de variables correctement appariées) est sûr. En effet, si vous aviez * pris la peine * de lire ce lien, vous verriez qu'il recommande l'utilisation de 'sscanf'.(Il est trivial d'empêcher les dépassements de tampon - vous pouvez limiter la taille des chaînes - et laisser les gens spécifier le format directement était toujours daft.) –

+0

Je cite http://crasseux.com/books/ctutorial/Formatted-string-input.html de ce tutoriel comme preuve de ce que j'ai dit. –

Questions connexes