2017-04-02 4 views
0

Pour une raison quelconque, la boucle while dans main se termine une fois que j'entre un caractère à rechercher, mais l'intention est que vous puissiez entrer une ligne et ensuite un caractère à rechercher jusqu'à vous entrez une ligne vide (n'entrez rien). Fondamentalement, je voudrais faire l'étape 1 et l'étape 2 infiniment jusqu'à ce que je ne tape rien et appuyez sur Entrée. Pourquoi ça ne marche pas? Merci à tous pour votre aide!La boucle while ne se poursuit pas comme prévu

En outre, une petite question, comment puis-je effacer les déchets après la saisie d'un caractère pour la recherche?

#include <stdio.h> 
#define SIZE 41 
int CharIsAt(char *pStr,char ch,int loc[],int mLoc); 
int main(void){ 
    char array[SIZE],search; 
    int found[SIZE],i,charsFound; 
    //Step 1 
    printf("Enter a line of text(empty line to quit): "); 
    while (fgets(array,SIZE, stdin)!=NULL && array[0]!='\n'){ //Loop until nothing is entered 
    //Step 2 
     printf("Enter a character to search: "); 
     search=getchar(); 
     charsFound=CharIsAt(array,search,found,SIZE); 
     printf("Entered text: "); 
     fputs(array,stdout); 
     printf("Character being searched for: %c\n",search); 
     printf("Character found at %d location(s).\n",charsFound); 
     for (i=0;i<charsFound;i++) 
      printf("%c was found at %d\n",search,found[i]); 
     printf("Enter a line of text(empty line to quit): "); 
    } 
    return 0; 
} 
int CharIsAt(char *pStr,char ch,int loc[],int mLoc){ 
    //Searches for ch in *pStr by incrementing a pointer to access 
    //and compare each character in *pStr to ch. 
    int i,x; 
    for (i=0,x=0;i<mLoc;i++){ 
     if (*(pStr+i)==ch){ 
      //Stores index of ch's location to loc 
      loc[x]=i; 
      x++; //Increment for each time ch was counted in pStr 
     } 
    } 
    //Returns the number of times ch was found 
    return x; 
} 

J'inclus mon code entier si ce n'est pas trop ennuyeux, je peux essayer de faire une version plus simple du problème si cela pouvait aider. Je pensais que poster tout le code pourrait être plus utile pour répondre à la question.

Merci encore, bravo!

+0

la fonction: 'getchar()' 'retourne en fait un int'. Par conséquent, la variable 'search' devrait être un' int' (entre autres choses, alors peut être vérifier pour 'EOF' et devrait vérifier '' \ n ' – user3629249

+0

pour faciliter la lisibilité et la compréhension: 1) suivre l'axiome: * seulement une déclaration par ligne et (au plus) une déclaration de variable par déclaration. * – user3629249

+0

le code affiché invite seulement l'utilisateur une fois pour une ligne d'entrée (et semble s'attendre à ce que l'utilisateur puisse 'lire le programme' savoir quand ils doivent entrer dans la ligne suivante à rechercher – user3629249

Répondre

2
while (fgets(array,SIZE, stdin)!=NULL && array[0]!='\n'){ 
     printf("Enter a character to search: "); 
     search=getchar(); 
     charsFound=CharIsAt(array,search,found,SIZE); 
     printf("Entered text: "); 
     fputs(array,stdout); 
     printf("Character being searched for: %c\n",search); 
     printf("Character found at %d location(s).\n",charsFound); 
     for (i=0;i<charsFound;i++) 
      printf("%c was found at %d\n",search,found[i]); 
     if (fgets(array,SIZE, stdin)==NULL) break; 
    } 
    return 0; 

Cela devrait fonctionner

+0

Non, ne fonctionnera pas, la séquence de nouvelle ligne de l'utilisateur entrant dans le char 'search' est toujours dans' stdin', donc le dernier appel à 'fgets()' sera toujours couronnée de succès – user3629249

1

le principal problème avec le code affiché est que l'utilisateur devait appuyer sur enter pour obtenir le caractère search dans le programme. Toutefois, l'appel à getchar() ne consomme qu'un seul caractère, il n'a donc pas consommé la séquence de nouvelle ligne.

Pour résoudre ce problème, appelez getchar() dans une boucle jusqu'à ce que le caractère soit EOF ou '\ n' pour vider stdin de n'importe quelle corbeille restante.

alors l'étape de retour au début de la boucle