2016-10-16 3 views
0

Je crée donc un shell très basique qui lit les choses ligne par ligne et j'ai des problèmes avec les boucles. Ceci est mon principal:Shell qui lit ligne par ligne

int main(int argc, char* argv[]) { 
    char* av[ARGVMAX]; 
    int nArgs, i, j, k; 

    fflush(stdout); 
    while (fgets(line, LINESIZE, stdin) != NULL && line[0] != '\n') { 
    for(i = 0; line[i] != '\n'; i++) { 
     temp[i] = line[i]; 
    } 
    scanf("%d", &nArgs); 
    j = 0; 
    while(j<nArgs) { 
     temp[i++] = ' '; 
     scanf("%c", &temp[i++]); 
     j++; 
    } 
    makeargv(temp, av); 
    runcommand(av); 
    fflush(stdout); 
    } 
return 0; 
} 

Tout d'abord, ce que je suis en train de faire est de transformer chaque ligne singulière qui est lu dans un tout, par d'autres mots, la lecture d'une « chaîne » et le mettre dans un tableau, en séparant chaque mot avec un ''. Maintenant, mon problème est, quand le programme est sur "scanf ("% c ", & temp [i ++])" il ne me laisse pas taper quoi que ce soit sur le premier coup, ce que cela signifie est que chaque fois que j'entre la boucle pour la première fois il saute cette ligne de code, mais sur les autres entrées de la boucle (deuxième ou troisième fois) il attend que j'écrive quelque chose.

Qu'est-ce que cela signifie? Est-ce que je fais quelque chose de mal? Merci d'avance!

+0

Si je lis correctement votre code, l'utilisateur tape une ligne d'entrée non vide, puis doit taper un nombre - qui est le nombre d'arguments, N pour la brièveté; et le nombre doit être suivi par N caractères uniques, dont chacun deviendra un argument? Cela ne ressemble pas à une interface de ligne de commande très agréable. Votre code manque également de protections contre les dépassements de tampon (que se passe-t-il si l'utilisateur tape 999999999 comme numéro?), Etc. Je pense que vous devez repenser ce que vous demandez aux utilisateurs de saisir. Et, comme les notes de réponse, '% c' lira le retour à la ligne après le nombre, ou l'espace, ou deux points, ou ... –

Répondre

1

Après la ligne

scanf("%d", &nArgs); 

il reste un newline dans le tampon d'entrée, ce qui est lu par la ligne

scanf("%c", &temp[i++]); 

Bien que le format %d (et la plupart des formats) ne pas tenir compte d'éventuels blancs dans le tampon d'entrée, %c ne pas, sauf si vous insérez un space comme ceci:

scanf(" %c", &temp[i++]); 
// ^
+0

Cela fonctionne maintenant !!! –

+0

Et si à la place de la fonction scanf j'utilisais la fonction fgets? Il pense toujours de la même manière dans la fonction fgets, comment puis-je le faire fonctionner? –

+0

'fgets' lit toujours' newline' (s'il est présent, par exemple la dernière ligne d'un fichier texte pourrait ne pas avoir 'newline'). –