--- In [email protected], ayyaz <ayya...@...> wrote:
>
> peternilsson42 wrote:
> > 
> > 
> > 
> > --- In [email protected] <mailto:c-prog%40yahoogroups.com>, ayyaz 
> > <ayyaz84@> wrote:
> >  > Steve Searle wrote:
> >  > > ayyaz scrawled:
> >  > > > switch (choice = getchar()) {
> >  > > > case 'r':
> >  > > >
> >  > > > case 'R':
> >  > > > printf("RED");
> >  > > > break;
> >  > > >
> >  > > > case 'w':
> >  > > >
> >  > > > case 'W':
> >  > > > printf("WHITE");
> >  > > > break;
> >  > > > }
> >  > > >
> >  > > > Should it not only output 'RED' or 'WHITE' when you
> >  > > > enter 'R' or 'W'?
> >  > >
> >  > > You don't have a break following the case 'r': and
> >  > > case 'w': statements. So control passes to the next
> >  > > statement - the corrosponding upper case ones.
> >  >
> >  > 1) Why does control pass it to the next statement when
> >  > the next statement is 'R' which is not equivalent to 'r'?
> > 
> > Because 'case' labels are just labels. Switches are like
> > big 'goto's. If something matches the case, then 'goto'
> > that statement.
> > 
> > C allows you to label any statement. It doesn't limit how
> > many labels you have for a given statement, though case
> > labels must appear inside of a switch statement.
> > 
> > Consider the following...
> > 
> > int foo(int n, const int a[], int x)
> > {
> > int i, j, s;
> > 
> > for (i = 0; i < n; i++)
> > {
> > for (s = j = 0; j <= i; j++)
> > {
> > if ( a[j] <= 0
> > || a[j] > (INT_MAX - s) / a[j] )
> > {
> > i = -1;
> > goto err;
> > }
> > 
> > s += a[j] * a[j];
> > if (s >= x)
> > goto fin;
> > }
> > }
> > 
> > err:
> > fin:
> > return i;
> > }
> > 
> > Here, I've labelled the final return statement twice. There
> > are two cases where I want to jump to it: on error, and on
> > success.
> > 
> > Case labels are no different. You can (almost) have as many
> > as you want. They don't mark separate blocks of statements,
> > they just mark individual statements that code can jump to.
> > 
> > Note that labels _must_ mark statements. You can't have a
> > label on its own...
> > 
> > void foo(void)
> > {
> > ... processing that does goto fin; ...
> > fin:
> > }
> > 
> > You need...
> > 
> > void foo(void)
> > {
> > ... processing that does goto fin; ...
> > fin:
> > ; /* null statment lebelled fin */
> > }
> > 
> > Once you understand that case labels are just labels, and
> > you can have many marking the same statement, then the
> > jump to and flow through effects of switch statements
> > become clearer...
> > 
> > case 'r': case 'R': /* come here if r or R */
> > printf("RED");
> > break;
> > case 'w': case 'W': /* come here if w or W */
> > printf("WHITE");
> > break;
> > 
> > -- 
> > Peter
> > 
> > 
> 
> Hello,
> 
> Thanks all for the help. I now understand that case labels are just 
> labels so any number of labels can be assigned to some statement.
> 
> I have written the following code.
> 
> #include <stdio.h>
> 
> int main(void)
> {
>       char color;
>       while (1) {
>               printf("\nPlease enter color: ");
>               scanf("%c",&color);
>               
>               switch (color) {
>               
>               case 'r':
>               case 'R':
>                       printf("\nRed");
>                       break;
>               
>               case 'g':
>               case 'G':
>                       printf("\nGreen");
>                       break;
>               
>               case 'b':
>               case 'B':
>                       printf("\nBlue");
>                       break;          
>               
>               default:
>                       printf("\nBlack");
>                       break;
>               }
>       }
> }
> 
> Basically it just prints Red, Green, Blue, or Black depending on what 
> the user enters. If the user enters anything besides RGB, then it prints 
> black. It works if I don't have a while loop but with the while loop the 
> default label always gets evaluated. What is the reason for this?
> 
> Thanks,
> --ayyaz
>
I think you need to put a space before the percentage sign. scanf is a funny 
function to use.
Like this scanf(" %c",&color);

Reply via email to