2013-10-10 5 views
1

J'ai donc un programme où j'ai besoin d'une commande initiale d'un utilisateur utilisant la fonction scanf, le problème est qu'il peut s'agir d'une commande de chaîne, d'une commande de chaîne et d'un argument de chaîne. une chaîne de commande et deux arguments intExécuter conditionnellement la fonction scanf?

donc je dois créer en quelque sorte une fonction scanf qui est capable de gérer tous ces éléments parce que je ne sais pas lequel sera sélectionné en premier

donc le code que je fis à gérer tous les cas de bord est

scanf("%s", c); 
scanf("%s%s", c, s; 
scanf("%s%d", c, &i); 
scanf("%s%d%d", c, &i, &i2); 

et des exemples de possible les commandes qui pourraient être saisis par l'utilisateur final

print 
insert Hello 
del 4 
pick 2 5 

mais cela ne fonctionnera pas

est donc là un moyen de faire une fonction scanf qui exécute certaines conditions?

Répondre

2

Vous pouvez lire que le premier mot, puis déterminer ce que vous devez lire la suite:

char command[32]; 
scanf("%s", command); 
if(strncmp(command, "print", 32) == 0) { 
    ... 
} 
else if(strncmp(command, "insert", 32) == 0) { 
    char string[32]; 
    scanf("%s", string); 
    ... 
} 
else if(strncmp(command, "del", 32) == 0) { 
    int i; 
    scanf("%d", &i); 
    ... 
} 
else if(strncmp(command, "pick", 32) == 0) { 
    int i, j; 
    scanf("%d %d", &i, &j); 
    ... 
} 
1

Lit toute la ligne, puis utilise sscanf pour l'analyser.

Certains mauvais code suit:

scanf("%s", buf); 
if (strcmp(buf, "print") == 0) { 
    call_print(); 
} else if (strncmp(buf, "insert ", 7) == 0) { 
    call_insert(buf + 7); // pointer magic! 
} else if (strncmp(buf, "del ", 4) == 0) { 
    int i; 
    sscanf(buf + 4, "%d", &i); // feel free to use atoi or something 
    call_del(i); 
} else if (strncmp(buf, "pick ", 5) == 0) { 
    int i, i2; 
    sscanf(buf + 5, "%d%d", &i, &i2); 
    call_pick(i, i2); 
} else { 
    printf("Does not compute!\n"); 
} 
3

Lire toute la ligne, de préférence avec une fonction de sécurité comme fgets, puis analyser la chaîne résultante pour déterminer si l'utilisateur a écrit une commande valide. L'exécution conditionnelle peut alors être réalisée en utilisant l'instruction if.

2

depuis la famille scanf des fonctions retourne le nombre de champs analysés avec succès, obtenir la chaîne complète en utilisant GETS, puis utilisez sscanf placer les modèles plus avant:

char buffer[,..], cmd[...]; 
int num1, num2; 

gets(buffer); 
if (sscanf(buffer, "%[^ ] %d %d", cmd, &num1, &num2) == 3) { 
... 
} 
else if (sscanf(buffer, "%[^ ] %d", cmd, &num1) == 2) { 
... 
} else { 
... 
} 

le motif %[^ ] obtenir une chaîne exclue la première vierge . De même, en séparant les motifs par espace, scanf ignore tout espace entre

Questions connexes