2009-11-07 4 views
0

J'écris une petite application en C qui prend deux paramètres. L'un est un nom de fichier, l'autre un nombre, et ils peuvent être spécifiés dans un ordre aléatoire.Déterminez si la chaîne de argv [1] commence par un caractère ou un nombre (programmation en C)

./main nom de fichier 12345

et

./main nom de fichier 12345

devrait à la fois le travail.

Comment puis-je déterminer facilement quel est le problème lorsque je sais que le nom de fichier commence par un caractère?

+3

Et si le nom de fichier est un nombre? – ntd

+0

Je suppose que dans ce cas, vous devrez utiliser la deuxième syntaxe ou vous allez confondre le programme :) – schnaader

+1

Comme je l'ai écrit: le nom de fichier commence par un caractère. – o01

Répondre

10

Vous pouvez utiliser les fonctions isalpha et isdigit (définies dans ctype.h) sur le premier caractère de argv[1] ou argv[2].

+3

Le problème principal avec chaque solution comme ceci vient si vous avez un nom de fichier qui est un nombre légal. Donc, vous devez vérifier la chaîne entière si elle se compose uniquement d'un nombre, puis aussi s'il n'y a pas de fichier existant. – Alfonso

+2

@frenetisch, ce ne serait pas un problème avec cette réponse, mais avec la question elle-même. Et ce n'est même pas un problème avec la question puisque l'OP déclare que tous les noms de fichiers commencent par un caractère. – paxdiablo

0
if ('0' <= argv[1][0] && argv[1][0] <= '9') 
{ 
    /* it starts with a number */ 
} 
6

Vous pouvez utiliser les fonctions ctype.

if (isalpha(*argv[1])) 
    // argv[1] starts with a letter 
else if (isdigit(*argv[1]) 
    // argv[1] starts with a number 
+1

Et n'oubliez pas de gérer le cas 'else' aussi bien ...' ./main/path/to/file 666'. Il suffit d'utiliser isdigit(), et supposer que le nom de fichier est probablement meilleur. – ndim

+0

Vous devez lancer '* argv [1]' à 'unsigned char', car il est de type' char', et 'isalpha' et' isdigit' spécifient que leur argument doit être dans la gamme 'unsigned char' ou' EOF'. – caf

2

Utilisez isdigit.

isdigit((unsigned char)argv[1][0]) 

Assurez-vous d'abord de vérifier argc.

+0

+1 pour le cast requis en 'unsigned char' – pmg

0

Vous pouvez également utiliser la fonction sscanf(), qui retourne le nombre d'éléments avec succès scannés:

int number; 
char *string; 

if (sscanf (argv[1], " %d ", &number) == 1) { /*12345 filename */ 
    string = malloc ((strlen (argv[2]) + 1) * sizeof (char)); 
    sscanf (argv[2], " %s ", string); 
} 
else { /* filename 12345 */ 
    sscanf (argv[2], " %d ", &number); 
    string = malloc ((strlen (argv[1]) + 1) * sizeof (char)); 
    sscanf (argv[1], " %s ", string); 
} 

Si argv[1] est une chaîne commençant par un caractère de la première clause de retour « zéro ».

+0

Il n'est pas nécessaire de copier les chaînes dans ce cas, vous pouvez simplement affecter' string' directement à 'argv [1] ou' argv [2] 'selon le cas. –

+0

Vous avez raison, Adam, ils sont dans la même portée. Merci d'avoir fait remarquer cela. –

Questions connexes