2017-09-26 12 views
1
  • Liste item

J'ai un problème à l'aide getchar() method.What Je suis en train de calculer est un petit simulateur de montage avec 8 commandes qui sont écrites par l'utilisateur sous la forme ADD Rx RyRx et Ry sont les registres. Je ne suis pas autorisé à utiliser des chaînes ni des tableaux, donc la seule option est de lire char par char.GetChar() fonction étrange

Mon problème est que je ne sais pas comment lire plusieurs caractères d'une ligne de texte d'entrée et de le mettre dans l'exemple variables.For, ADD Rx Ry Je veux stocker dans Ach1, D dans ch2 et D dans ch3 puis sauter l'espace vérifier R et stocker x dans une variable, puis la même chose pour y.

La chose étrange est que lorsque je l'entrée de la deuxième commande après la première, le programme qui est illustré ci-dessous juste ne montrerais pas les mêmes valeurs d'impression exactes (l'impression est juste pour le débogage)

do{ 
    ch1=getchar(); 
    ch2=getchar(); 
    ch3=getchar(); 
    if(ch1=='E' && ch2=='N'&& ch3=='D'){ 
    break; 
    } 
    printf("%c",ch1); 
    printf("%c",ch2); 
    printf("%c",ch3); 
}while(1); 
+0

Quelle entrée donnez-vous? Inclut-il les nouvelles lignes? Lisez-vous la nouvelle ligne? Quel résultat attendiez-vous? Quel résultat obtenez-vous? –

+0

Vous devez également lire le saut de ligne. –

Répondre

0

Lorsque les types d'utilisateurs "ADD Rx Ry", il va appuyez sur Entrée.

getchar() consomme un caractère à la fois. Donc, pour consommer cette entrée, vous devez appeler 8 fois getchar(), 3 pour "AJOUTER", 2 pour les espaces et 4 pour les registres.

Maintenant, vous voulez entrer "ADD Ri Rj", donc vous pensez que vous devrez appeler à nouveau getchar() 8 fois.

Le premier appel de getchar() consommera le retour à la ligne après l'entrée précédente (lorsque l'utilisateur appuie sur Entrée)! Il ne consommera pas "A", comme vous l'espériez. Par conséquent, lorsque "END" est tapé, il y a des retours à la ligne et des caractères des entrées précédentes (le cas échéant) qui seront consommés par getchar().

Alors, juste consommer la nouvelle ligne de fuite (et continuer votre boucle, puisque vous ne voulez pas traiter le caractère de nouvelle ligne, juste pour le consommer), comme ceci:

do { 
    ch1 = getchar(); 
    if(ch1 == '\n') 
    continue; 
    ch2 = getchar(); 
    if(ch2 == '\n') 
    continue; 
    ch3 = getchar(); 
    if(ch3 == '\n') 
    continue; 
    ch4 = getchar(); 
    if(ch4 == '\n') 
    continue; 

    if(ch1=='E' && ch2=='N'&& ch3=='D') { 
    break; 
    } 
} while(1); 
0

Vous devez également lire le saut de ligne. En outre, vous devez vider stdin pour supprimer tout excès de sortie après la numérisation. Si vous ne pouvez pas utiliser de chaînes ni de tableaux, et que la seule option est d'utiliser getchar, vous n'aurez pas à gérer manuellement le buffer de 4 caractères, ce qui ne va pas être joli.

char ch1, ch2, ch3, ch4; 
do { 
    ch1 = getchar(); if (ch1 == '\n') continue; 
    ch2 = getchar(); if (ch2 == '\n') continue; 
    ch3 = getchar(); if (ch3 == '\n') continue; 
    ch4 = getchar(); if (ch4 != '\n') continue; 
    if (ch1 == 'E' && ch2 == 'N' && ch3 == 'D' && ch4 == '\n') break; 
} while (1); 

ce qui arrive quand vous ne prennent pas en compte pour la nouvelle ligne et de rinçage stdin est ceci:

  1. utilisateur entre ADD\n (4 caractères).
  2. ADD est numérisé, ch1 contient 'A', ch2 contient 'D', ch3 contient 'D'. '\n' est laissé dans le stdin.
  3. L'itération suivante vient. L'utilisateur entre à nouveau ADD\n.
  4. Cependant, il est '\n' laissé dans stdin de l'analyse précédente, donc ch1 contient '\n', ch2 contient 'A', ch3 contient 'D' et il y a D\n restes dans stdin.
+0

@Bob__ Et? Mon code n'est pas identique au code de l'OP car le code de l'OP est cassé. – MarkWeston

0

Lorsque vous commencez à taper des données dans le terminal, d'abord dire que vous avez saisi "ADD \ n",

  • A est stocké dans CH1
  • D est stocké dans ch2
  • D est stocké dans ch3

et que '\ n' est envoyé au tampon.Maintenant, la deuxième fois que vous commencez à taper nouveau jeu de caractères, dire « SUB », getchar() commence la lecture de la mémoire tampon et le premier caractère qu'il rencontre est le « \ n », et ainsi de suite, donc

  • CH1 = '\ n'
  • ch2 = 's'
  • ch3 = 'U'

une meilleure solution à un problème est d'ajouter une getchar() après tous les trois getchar() s qui consommera l'extra '\ n' et n'imprimera pas le même.

do{ 
    ch1=getchar(); 
    ch2=getchar(); 
    ch3=getchar(); 
    getchar(); 

if(ch1=='E' && ch2=='N'&& ch3=='D'){ 
    break; 
    } 
    printf("%c",ch1); 
    printf("%c",ch2); 
    printf("%c",ch3); 
}while(1); 
return 0; 

}