wolexzo2 wrote: > > > > --- In [email protected] <mailto:c-prog%40yahoogroups.com>, ayyaz > <ayya...@...> wrote: > > > > peternilsson42 wrote: > > > > > > > > > > > > --- In [email protected] <mailto:c-prog%40yahoogroups.com> > <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); > > Hello,
Thanks. Adding a space in front of % fixed the problem. Is there a reason why this is so? Thanks, --ayyaz.
