A problem with (switch) in C - c

scanf("%ld",&l);
printf ("l=%ld",l);
switch (l)
{
case'1':
XOR(&matrix1[10],&matrix2[10],m);
break;
case'2':
AND(&matrix1[10],&matrix2[10],m);
break;
default:
printf("\n\t\tWrong input");
}
When the program reaches switch, no matter what I enter (whether it's wrong or right), the program keeps showing the massage (Wrong input), though I've entered a right number (1 or 2).

Change your case labels from
case'1':
...
case'2':
...
to
case 1:
...
case 2:
...
Explanation: your switch value is an integer, not a character, hence you need integer constants for your case labels, not character constants.

Your case should be case 1 and not case '1'.

'1' != 1
Note: '1' is nearly 60 or something like that, 'cause single quotes mean "using char" (or it's ASCII code). Try removing 'em from your switch cases:
scanf("%ld",&l); printf ("l=%ld",l); switch (l) { case 1: XOR(&matrix1[10],&matrix2[10],m); break; case 2: AND(&matrix1[10],&matrix2[10],m); break; default: printf("\n\t\tWrong input"); }
Or you can change your input from numeric to char:
scanf("%c", &l);

But you aren't reading a character but your cases are characters. Re-write as follows:
switch (l)
{
case 1:
XOR(&matrix1[10],&matrix2[10],m);
break;
case 2:
AND(&matrix1[10],&matrix2[10],m);
break;
default:
printf("\n\t\tWrong input");
}

'1' and 1 are not the same.

Because your switch is relying on an integer. Whereas you're taking in a string. You'll need to run l through atoi first.

'1' is a char, the ASCII representation of the digit 1. Use plain 1 instead.
case 1:
/*...*/
break;

That's because:
case '1':
is not the same as:
case 1:
The second one is the one you seem to be expecting.

Related

scanf() not returning the proper value?

I have a function as part of a larger program to determine the quantity of products sold on each day of the previous week. Here is the function that performs the case switch:
unsigned int switchfn()
{
int productNumber; // product 1 through 5
// only while product 1 through 5 is being entered.
while ((scanf("%d", &productNumber)) != EOF) {
// gather product data
switch (productNumber) {
case '1': // product one
++productOne;
break;
case '2': // product two
++productTwo;
break;
case '3': // product three
++productThree;
break;
case '4': // product four
++productFour;
break;
case '5': // product five
++productFive;
break;
case '\n': // ignore new line
case '\t': // ignore tab
case ' ': // ignore space
break;
default: // catch all other characters
printf("%s", "No such product exists.");
puts(" Please enter a valid product number.");
break;
}
}
return 0;
}
However, when the program runs, it always jumps to the default, even when entering numbers 1 through 5. Is this an issue with what scanf() is returning?
You appear to be getting confused between integers and ASCII digits. You're performing formatted extraction, but inspecting productNumber as if it were the actual ASCII character found in the input.
Remember, '1' is actually 49.
Since you want to cover cases like '\n' too, read into a char with %c instead. Then the extraction operation won't perform the formatting conversion for you as it is now, and your character literal comparisons will be correct.
Case '1' - at this moment you are asking compiler to check did you enter a character '1' - his ASCII value is 49 and that's the reason why he is just skipping to default case. Try to input " %c"
scanf("%d", &productNumber) get productNumber is a interger.
But case '1' : '1' is a char and his ASCII value is 49 and so every time you input a interger, there is no match case just skipping to default case. u can input " %c" to get a char.
Since your scanf function is referencing an integer, you merely have to switch your cases to integers:
case 1:
//your logic
break;
case 2:
//your logic
break;

Why does scanf function get automatically previous '\n' value and how can I escape from this event?

I'm not new at writing code. But I'm just learning C language. I cannot understand this subject. Perhaps it is not an issue but now it is an issue for me. Would you please explain that?
Here is code, where I encounter with this:
#include <stdio.h>
int main(int argc, char *argv[])
{
char letter;
while (1)
{
printf("Enter a letter:\n");
scanf("%c", &letter);
switch (letter)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'u':
case 'U':
case 'o':
case 'O':
printf("%c is a vowel letter.\n", letter);
break;
case 'y':
case 'Y':
printf("%c is sometimes a vowel letter.\n", letter);
break;
default:
printf("%c is not a vowel letter.\n", letter);
}
}
return 0;
}
Output:
Enter a letter:
a
a is a vowel letter.
Enter a letter:
is not a vowel letter.
Enter a letter:
Change the format from "%c" to " %c" to make scanf discard all whitespace (as determined by isspace(), " \v\f\r\n\t" in the POSIX and C locales) before assigning the next character, whatever it may be.
Maybe a better alternative, read a whole line with fgets and then use sscanf to parse it instead.
As an aside, take care that scanf can always fail. On success, it returns the number of assigned arguments.
Also, I strongly suggest you read the scanf-manpage I linked above (or even better, the C standard on scanf), because there are quite a lot of pitfalls you may not know yet.

switch statement in C

Is the following switch statement correct? I mean can i use constant and character literal in one switch case statement?
It works in code but I am asking from good practices standpoint.
switch(arg[1]) {
case '4':
printf("value is 4\n");
break;
case '6':
printf("value is 6\n");
break;
case 'M':
printf("value is M\n");
break;
default:
break;
}
It works in code but I am asking from good practices standpoint.
Yes, it's fine to use char variables and constants in switch statements. It's very common to see that, for example, to process command line arguments. char is an integer type, and switch works as well with char as with any other integer type.

What am I doing wrong with this menu in C

I am new at C and am trying to create my first menu! But whenever the user inputs 1 and enter the default option appears and reload the menu. Although when 4 and enter are hit the default option also appears but the menu is successfully exited.
void begin_menu(void)
{
int choice;
do
{
printf("English Draughts - Main Menu\n\n");
printf("1. Play Game\n");
printf("2. Display Winners\n");
printf("3. Reset Scoreboard\n");
printf("4. Quit\n");
scanf("%d",&choice);
switch (choice)
{
case '1' : play();
break;
case '2' : /*write function to do here */
break;
case '3' : /*write function to do here */
break;
case '4' :
printf("Goodbye!\n");
exit(0);
break;
default:
printf("Please insert a correct choice.\n");
break;
}
} while (choice != 4);
}
void play(void)
{
while(end != "n");
{
printf("Player Names\n\n");
printf("Enter name for first player:\n");
scanf("%s",&player_one);
printf("Enter name for second player:\n");
scanf("%s",&player_two);
printf("Begin?(y to start, n to quit)\n");
scanf("%c",&end);
}
return;
}
Thanks everyone, but I have the problem that if play() is called.. ie 1 is entered.. the console just looks for input and doesn't print the function information at all.
'1'and 1 are not the same thing
The first one is an ascii character, the second one is a number.
You can lookup the value of '1' in the ascii table and see that it is 49, which does not equal 1.
Try entering 49 in your console, just for fun :)
You are evaluating strings instead of integers.
You defined the choice variable as an integer, so comparisons must be with integers to. Remove the ' around your numbers inside your switch statement and it should work fine.
You are having choice as integer data type.
int choice;
But in switch case you are checking for character constants. So it leads to default case always. Because '1' and 1 are not same!
Try the below changes-
switch (choice)
{
case 1 : play();
break;
case 2 : /*write function to do here */
break;
case 3 : /*write function to do here */
break;
case 4 : printf("Goodbye!\n");
exit(0);
break;
default: printf("Please insert a correct choice.\n");
break;
}
You have case '1' instead of case 1
'1' is an ascii character and 1 is an integer.
As others mentioned, '1' and 1 are not the same. '1' has a decimal value of 49. You can fix your code by:
changing choice to be type of char and then tell scanf to expect format of %c, not %d
or you can change your switch cases to use decimal values.
Switch cases accepts only integer constants. All of the cases are evaluated to integers, hence your code works. Note that switch cases won't work with string literals. If you would type "1" instead of '1' you would get a compiler error.

Switch Statement Not Executing Cases (c)

I made a switch statement, however, it only works with constants already set. If I try to use it with user input, only one of the cases work, every other one doesn't. Now no matter what I enter, it always uses the default case. I tried adding another getchar() to clear the \n character from the buffer but this isn't making a difference. Ill post the entire switch statement here :
char option=' ';
option=getchar();
switch(option){
//Parallel resistance calculations
case 'p':
CLEAR
//PResistance();
printf("RESISTANCE");
getchar();
break;
//Ohm's Law calculations
case 'o':
CLEAR
printf("OHM");
//Ohm();
break;
//Exits program
case 'q':
printf("Good bye! Stay safe in the laboratory! :)\nPress any key to exit");
getchar();
exit(0);
break;
//Error checking
default :
printf("Invalid input, Try again");
break;
}
}
while (option!='q');
I commented out the functions so I could use the print statements to test if its working.
Whenever you input a character or string from stdin in C, always make sure there is no \n in the input buffer. To do this, always getchar() after taking integer or float inputs.
In your case, maybe you've inputted an integer before inputting the character. So try to write a getchar() before taking the character input.

Resources