Having trouble implementing forever loop

128 views Asked by At

I seems to be having trouble with the forever loop, it seems to be working the first time i run the program but for some reason it seems to skip the option of asking the user if they would like to enter anymore CDs... Any help would be appreciated, thank you!

/* 
 * CourseProj.c
 * Create a program (database) that a record shop might use to track its 
    inventory of CDs
 * We need the following fields:
 * - Tittle, Artist, Number of tracks, Album/single, Price
 * This project must be commented
 */

 #include <stdio.h>

 main(){

 char    title [100][61];
 char    artist [100][61];
 int     num_tracks[100];      /* number of tracks on the CD */  
 float   price[100];         
 int     album[100];           /* boolean - is the CD an ALBUM? */
 char    type;                 /* used to read in album/single info */
 int     count = 0;            /* how many Cds are being tracked */
 int     i;                    /* loop counter */


 printf( "Welcome to the CD database.\n");
 printf( "You can store a maximum of 100 CDs.\n");

 /*
  * Loop until they no longer wish to enter any more CDs
  *
  */
 for (;;){      /* forever loops are convenient for this sort of thing */
   /*
    * Ask them if they want to enter another CD
    * Any answer other than y or Y wil be treated as a No
    */
   printf("\nHave you any more CDs to enter (y/n)? ");
   fflush(stdin);
   scanf("%c", &type);
   if (type != 'y' && type !='Y')
     break;


   printf("\n");   /* for neat output */

   // First, the title
   printf("Please enter the details of the CD %d... \n\n", count+1);
   printf("Title? ");
   fflush(stdin);
   scanf("%s", title[count]);


   // input the artist name
   printf("Artist? ");
   fflush(stdin);
   scanf("%s", artist[count]);

   // Now we need to input the number of tracks in the Album
   printf("Number of tracks? ");
   fflush(stdin);
   scanf("%d", &num_tracks[count]);

   // need to check if it's an Album or a single
   for (;;){
     printf("Album or single (a for album, s for single)? ");
     fflush(stdin);
     scanf(" %c", &type);
     if  (type == 'a' || type == 's')
       break;
     printf("Error - only 'a' or 's' are allowed\n");
    }
    album[count] = type == 'a'; // if we get here it must be 'a' or 's'               


    //need to prompt the user for the price of the cd
    printf("Retail price (e.g. 4.65)?");
    fflush(stdin);
    scanf("%f", &price[count]);
    count = count + 1;

    /*
     * Check if we have filled up the array
     */
    if (count == 100){
      printf("You have reached the limits of this program\n\n");
      break;
    }
   }
   /*
    * Output the CD details
    */
   for ( i = 0; i < count; i++){

     printf("\nThe details of CD %d are:\n", i+1);
     printf("==============================\n"); 
     printf("Title: %s\n", title[i]);
     printf("Artist: %s\n", artist[i]);
     printf("Number of track: %d\n", num_tracks[i]);
     //let check what the user input with the boolean


     if (album[i])
       printf("Album\n");

     else
       printf("Single\n");

     printf("Price: %.2f\n", price[i]); 
     printf("===========================\n");


     if ( i < count - 1){ // only do this if there are more CDs to see

     /*
      * A user-friendly way to progress to the next CD
      */
      printf("\nPress ENTER to see the next set of details: ");


      fflush(stdin);
      getchar();
     }
    }

    /*
     * A user-friendly way to exit the program
     */
     printf("\nPress ENTER to exit the program: ");
     fflush(stdin);
     getchar();
    }
2

There are 2 answers

0
Menios On

Try using this chunk of code into your program to fetch the character from the userĀ“s input. It worked for me while I runned it in VisualStudio 2012.

printf("\n Have you any more CDs to enter (y/n)? ") ;
fflush(stdin);

type = getchar() ;

if( type == '\n')
{
   break ;
}

printf("you have typed : %c \n",type) ; /*print the character just to make sure that 
                                         it's the right one the user entered. */                                        

if (type != 'y' && type !='Y')
{
  break;
}
0
mike On

This should be the correct version. Whenever you want to stop waiting for the user to press a key you should "eat" the newlines! It means that if you acquire some data from the kwyboard with a scanf for instance, the user will press enter at the end to confirm the acquisition, that enter is a newline stored in the input buffer so I put some getchar() here and there to get rid of them. The fflush() does not work because it can only force stdout and stderr to be flushed. Solution is the following:

#include <stdio.h>

main(){
    char    title [100][61];
    char    artist [100][61];
    int     num_tracks[100];      /* number of tracks on the CD */  
    float   price[100];         
    int     album[100];           /* boolean - is the CD an ALBUM? */
    char    type;                 /* used to read in album/single info */
    int     count = 0;            /* how many Cds are being tracked */
    int     i;                    /* loop counter */


    printf( "Welcome to the CD database.\n");
    printf( "You can store a maximum of 100 CDs.\n");

    /*
    * Loop until they no longer wish to enter any more CDs
    *
    */
    for (;;){      /* forever loops are convenient for this sort of thing */
    /*
     * Ask them if they want to enter another CD
     * Any answer other than y or Y wil be treated as a No
     */
    printf("\nHave you any more CDs to enter (y/n)? ");
    scanf("%c", &type);
    getchar();
    if (type != 'y' && type !='Y')        
        break;

    printf("\n");   /* for neat output */

    // First, the title
    printf("Please enter the details of the CD %d... \n\n", count+1);
    printf("Title? ");

    scanf("%s", title[count]);


    // input the artist name
    printf("Artist? ");

    scanf("%s", artist[count]);

    // Now we need to input the number of tracks in the Album
    printf("Number of tracks? ");
    scanf("%d", &num_tracks[count]);

    // need to check if it's an Album or a single
    for (;;){
        printf("Album or single (a for album, s for single)? ");
        scanf(" %c", &type);
        if  (type == 'a' || type == 's')
            break;
        printf("Error - only 'a' or 's' are allowed\n");
    }
    album[count] = type == 'a'; // if we get here it must be 'a' or 's'               


    //need to prompt the user for the price of the cd
    printf("Retail price (e.g. 4.65)?");
    scanf("%f", &price[count]);
    getchar();
    count = count + 1;

    /*
     * Check if we have filled up the array
     */
    if (count == 100){
        printf("You have reached the limits of this program\n\n");
        break;
    }
    /*
     * Output the CD details
     */
    for ( i = 0; i < count; i++){

        printf("\nThe details of CD %d are:\n", i+1);
        printf("==============================\n"); 
        printf("Title: %s\n", title[i]);
        printf("Artist: %s\n", artist[i]);
        printf("Number of track: %d\n", num_tracks[i]);
        //let check what the user input with the boolean


        if (album[i])
            printf("Album\n");
        else
            printf("Single\n");

        printf("Price: %.2f\n", price[i]); 
        printf("===========================\n");

        if ( i < count - 1){ // only do this if there are more CDs to see
            /*
             * A user-friendly way to progress to the next CD
             */
            printf("\nPress ENTER to see the next set of details: ");
            while(getchar() != '\n');
        }
    }
}
/*
 * A user-friendly way to exit the program
 */
 printf("\nPress ENTER to exit the program: ");
 while(getchar() != '\n');

}