2010-04-18 7 views
2

Mon application est essentiellement un shell qui attend une entrée de type cmd [x], où cmd est constante et x est facultative. Donc cmd 1 est légal ainsi que cmd par lui-même - alors je suppose un paramètre par défaut pour x.Facultatif lu à partir de STDIN dans C

Je fais ceci:

char cmd[64]; 
scanf("%s", cmd); 
int arg; 
scanf("%d", &arg); // but this should be optional 

Comment puis-je lire le paramètre entier, et le mettre à une valeur par défaut si aucune est actuellement disponible dans l'invite? Je ne veux pas que l'invite attende une entrée supplémentaire si elle n'a pas été donnée dans la commande d'origine. J'ai essayé plusieurs versions en utilisant fgetc() et getchar() et en les comparant à EOF mais en vain. Chaque version que j'ai essayé finit par attendre sur ce paramètre entier optionnel.

Répondre

3

La manière simple:

char b[73]; //powers of 2 magic is evil. 
    if(fgets(b,sizeof b,stdin) != NULL) { 
     char cmd[59]; //59, no command will ever be > 58. Ever I say. 
     int arg; 
     if(sscanf(b,"%58s %d",cmd,&arg) == 2) { 
     //handle cmd and arg 
     } else if(sscanf(b,"%58s",cmd) == 1) { 
     //handle cmd only 
     } else { 
     // :-/ 
     } 
    } 
+0

Facile, mais faux - oups, vous l'avez édité. –

+0

Le second sscanf est inutile, si le premier a renvoyé 1, il a eu le même effet que le second sscanf. – Juliano

+0

Si le premier a retourné 1, comment êtes-vous absolument, 100% sûr, dans tous les cas, compilateur, plate-forme, sachez qu'il n'a pas analysé 'arg' ok, mais barfed sur 'cmd'? Bien que 1 ou 2 sccanfs - Il est encore très sous-optimal, car vous voulez vraiment signaler les erreurs à l'utilisateur s'il a donné 2 arguments, mais le 2. n'a pas pu être analysé. – leeeroy

2

Réponse simple, vous ne pouvez pas. Le runtime C prend l'entrée du système d'exploitation, mais ne le contrôle pas. Pour faire quelque chose comme ça, vous devrez interagir directement avec le système d'exploitation en utilisant des API spécifiques à la plate-forme.

+0

Est-ce parce que 'stdin' ne retourne jamais' EOF'? C'est ce que je soupçonnais ... –

+0

Non, stdin renvoie EOF mais seulement après avoir rencontré une fin de fichier (par exemple l'utilisateur a tapé Ctrl-D, ou autre), sinon il attend juste que l'utilisateur tape quelque chose. –

+0

C'est ce que je voulais dire ... Dans le contexte courant d'une application, il ne recevra jamais de 'EOF', évidemment, jusqu'à ce qu'il soit terminé. –

1

Lisez-vous ligne par ligne? Ne pouvez-vous pas lire la commande entière jusqu'à ce que vous atteigniez un "\ n" (nouvelle ligne)? Si vous obtenez deux jetons avant le retour à la ligne, c'est une commande et l'argument; Si vous en lisez seulement un, c'est la commande seulement et vous définissez le deuxième argument à la valeur par défaut.

+0

Ceci est bien sûr la bonne solution - vous ne devriez pas utiliser scanf() pour une entrée interactive en premier lieu. –

0

Voici un programme qui fonctionne (désolé ma réponse précédente a été faite à la hâte).

int main(){ 
    char cmd[100], line[100]; 
    int man = 0; 
    printf("OK: "); 
    fgets(line, 100, stdin); 
    int num = sscanf(line,"%s %d",cmd,&man); 
    if (num==1)printf("one! %s %d\n", cmd, man); 
    else if (num==2)printf("two! %s %d\n", cmd, man); 
} 

fgets lit la ligne (avec la vérification des limites), et sscanf évaluera si un ou deux jetons ont été saisis.

+0

dang, n'a pas actualisé. –

+0

mk. J'ai essayé avant et il a dit "voulez-vous voter pour qu'il soit supprimé?" ce qui n'a pas de sens ... ça marche maintenant. Merci. –

Questions connexes