How do i create an option in switch case? - switch-statement

I've recently tried to make some switch case function. Now, I'm currently trying to make an option but it seems it always skips the if part in case 1. The input just doesn't go in the if - else part.
#include <stdio.h>
int main(){
int option;
char choice;
int celcius;
menu:
printf("Welcome to program.\n");
printf("1. Input celcius\n");
printf("2. Convert To Kelvin\n");
printf("3. Convert To Fahrenheit\n");
printf("4. Convert To Reamur\n");
scanf("%d", &option);
switch(option){
case 1:
scanf("%d", &celcius);
printf("The value is : %d\n", celcius);
printf("Continue? : (y/n)\n"); scanf("%c", &choice);getchar();
if(choice == 'y' || choice == 'Y'){
goto menu;
}else if(choice == 'n' || choice == 'N');
break;
}
case 2:
printf("Please input the value: "); scanf("%d", &celcius);
int kelvin = celcius + 273;
printf("Converted Value is : %d\n", kelvin);
break;
case 3:
printf("Please input the value: "); scanf("%d", &celcius);
int fahrenheit = celcius + 32;
printf("Converted Value is : %d\n", fahrenheit);
break;
case 4:
printf("Please input the value: "); scanf("%d", &celcius);
int reamur = 5/4 * celcius;
printf("Converted Value is : %d\n", reamur);
break;
default:
printf("Wrong input.\n");
}
return 0;
}
(incomplete code because currently trying to make the case 1 works.)
Any solutions will help : )

You have a getchar() after the scanf() for choice. This is reading the newline character that is left in the input buffer after the scanf() for option.
You need to remove the getchar() and change the scanf() for choice to:
scanf(" %c", &choice);
The space before the %c will skip any whitespace characters in the input buffer.

Related

In C gets function is not working in iteration

At first do while iteration in my code, the gets() function works fine, but from the next iteration it skips the gets() function and moves on to the following statement.
So please anyone sort out the problem with a solution. The problem part will be highlighted in bold. The code is as follows:
void main()
{
char string[150], cont[5];
int total = 0, alpha = 0, digit = 0, spl_char = 0, upp = 0, low = 0;
int i, vowels = 0,consonants = 0;
int choice;
do
{
system("cls");
printf("\t\t\t\tSTRING OPERATIONS\n");
printf("\t\t\t\t~~~~~~ ~~~~~~~~~~\n");
printf("\nEnter the String: ");
***gets(string);*** // the problem part
printf("\nEnter your choice: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("1");
break;
case 2:
printf("2);
break;
default:
printf("\nSorry! The Entered Choice is Not Available. Try Again!");
break;
}
do
{
printf("\nDo you want to Continue (yes/no): ");
scanf("%s", cont);
if (stricmp(cont, "yes") == 0 || stricmp(cont, "no") == 0)
break;
printf("\nError!!! Please type only yes or no.\n");
} while(stricmp(cont, "yes") != 0 || stricmp(cont, "no") != 0);
} while(stricmp(cont, "yes") == 0);
}
The first iteration it asks & waits for the input:
for eg:
Enter the String: bat
and the process continues....
And in second iteration it just asks and skips to following statement:
for eg:
Enter the String:
Enter your choice:

Reduce a string when it has a pair

Shil has a string S , consisting of N lowercase English letters. In one operation, he can delete any pair of adjacent letters with same value. For example, string "aabcc" would become either "aab" or "bcc" after operation.
Shil wants to reduce S as much as possible. To do this, he will repeat the above operation as many times as it can be performed. Help Shil out by finding and printing 's non-reducible form!
If the final string is empty, print Empty String; otherwise, print the final non-reducible string.
Sample Input 0
aaabccddd
Sample Output 0
abd
Sample Input 1
baab
Sample Output 1
Empty String
Sample Input 2
aa
Sample Output 2
Empty String
Explanation
Sample Case 0: Shil can perform the following sequence of operations to get the final string:
Thus, we print .
Sample Case 1: Shil can perform the following sequence of operations to get the final string: aaabccddd -> abccddd
abccddd -> abddd
abddd -> abd
Thus we print abd
Sample case 1: baab -> bb
bb -> Empty String.
in my code in the while loop when i assign s[i] to str[i].the value of s[i] is not getting assigned to str[i].the str[i] has a garbage value.
my code :
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
string s;
cin>>s;
int len = s.length();
int len1 = 0;
string str;
for(int i = 0;i < len-1;i++){
if(s[i]!= '*'){
for(int j=i+1;j < len;j++){
if(s[j] != '*'){
if(s[i] == s[j]){
s[i] = s[j] = '*';
}
}
}
}
}
int i = 0;
while(i<len){
if(s[i] != '*'){
str[len1] = s[i];
len1++;
}
i++;
}
if(len1 != 0){
cout<<str;
}
else{
cout<<"Empty String";
}
return 0;
}
#include <iostream>
using namespace std;
int main(){
string s,tempS;
bool condition = false;
cin >> s;
tempS = s;
while(condition==false){
for(int i=1; i<s.size(); i++){
if(s[i]==s[i-1]){
s.erase(s.begin()+i-1, s.begin()+i+1);
}
}
if(tempS == s){
condition = true;
} else{
tempS = s;
}
}
if(s.size()==0){
cout << "Empty String" ;
} else{
cout << s;
}
return 0;
}
the first while loop keeps on modifying the string until and unless it becomes equal to temp (which is equal to the string pre-modification)
It is comparing the adjacent elements if they are equal or not and then deleting them both.
As soon as string becomes equal to temp after modifications, string has reached it's most reduced state !

How to return a int converted to char array back to main for displaying it

My doubts are as follows :
1 : how to send 'str' from function 'fun' , So that i can display it in main function.
2 : And is the return type correct in the code ?
2 : the current code is displaying some different output.
char * fun(int *arr)
{
char *str[5];
int i;
for(i=0;i<5;i++)
{
char c[sizeof(int)] ;
sprintf(c,"%d",arr[i]);
str[i] = malloc(sizeof(c));
strcpy(str[i],c);
}
return str;
}
int main()
{
int arr[] = {2,1,3,4,5},i;
char *str = fun(arr);
for(i=0;i<5;i++)
{
printf("%c",str[i]);
}
return 0;
}
how to send 'str' from function 'fun' , So that i can display it in main function.
This is the way:
char* str = malloc( size );
if( str == NULL ) {
fprintf( stderr,"Failed to malloc\n");
}
/* Do stuff with str, use str[index],
* remember to free it in main*/
free(str);
And is the return type correct in the code ?
No, Probably char** is the one you need to return.
the current code is displaying some different output.
Consider explaining what/why do you want to do ? The way you have written, seems completely messed up way to me. You're passing array of integer but not its length. How is the fun() supposed to know length of array? Another problem is array of pointers in fun().
You can't write a int to a char (See the both size). So I used char array instead.
However, I'm not sure if this is what you want to do (might be a quick and dirty way of doing it):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char**
fun(int *arr, int size)
{
char **str = malloc( sizeof(char*)*size );
if( str == NULL ) {
fprintf( stderr, "Failed malloc\n");
}
int i;
for(i=0;i<5;i++) {
str[i] = malloc(sizeof(int));
if( str == NULL ) {
fprintf( stderr, "Failed malloc\n");
}
sprintf(str[i],"%d",arr[i]);
}
return str;
}
int
main()
{
int arr[] = {2,1,3,4,5},i;
char **str = fun(arr, 5);
for(i=0;i<5;i++) {
printf("%s\n",str[i]);
free(str[i]);
}
free(str);
return 0;
}
I made these changes to your code to get it working:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **fun(int *arr)
{
char **str = malloc(sizeof(char *) * 5);
int i;
for(i = 0; i < 5; i++) {
if ((arr[i] >= 0) && (arr[i] <= 9)) {
char c[2] ;
sprintf(c, "%d", arr[i]);
str[i] = (char *) malloc(strlen(c) + 1);
strcpy(str[i],c);
}
}
return str;
}
int main()
{
int arr[] = {2, 1, 3, 4, 5}, i;
char **str = fun(arr);
for(i = 0; i < 5; i++) {
printf("%s", str[i]);
free(str[i]);
}
printf("\n");
free(str);
return 0;
}
Output
21345
I added a check to make sure that arr[i] is a single digit number. Also, returning a pointer to a stack variable will result in undefined behavior, so I changed the code to allocate an array of strings. I don't check the return value of the malloc calls, which means this program could crash due to a NULL pointer reference.
This solution differs from the others in that it attempts to answer your question based on the intended use.
how to send 'str' from function 'fun' , So that i can display it in main function.
First, you need to define a function that returns a pointer to array.
char (*fun(int arr[]))[]
Allocating variable length strings doesn't buy you anything. The longest string you'll need for 64bit unsigned int is 20 digits. All you need is to allocate an array of 5 elements of 2 characters long each. You may adjust the length to suit your need. This sample assumes 1 digit and 1 null character. Note the allocation is done only once. You may choose to use the length of 21 (20 digits and 1 null).
For readability on which values here are related to the number of digits including the terminator, I'll define a macro that you can modify to suit your needs.
#define NUM_OF_DIGITS 3
You can then use this macro in the whole code.
char (*str)[NUM_OF_DIGITS] = malloc(5 * NUM_OF_DIGITS);
Finally the receiving variable in main() can be declared and assigned the returned array.
char (*str)[NUM_OF_DIGITS] = fun(arr);
Your complete code should look like this:
Code
char (*fun(int arr[]))[]
{
char (*str)[NUM_OF_DIGITS] = malloc(5 * NUM_OF_DIGITS);
int i;
for(i=0;i<5;i++)
{
snprintf(str[i],NUM_OF_DIGITS,"%d",arr[i]); //control and limit to single digit + null
}
return str;
}
int main()
{
int arr[] = {24,1,33,4,5},i;
char (*str)[NUM_OF_DIGITS] = fun(arr);
for(i=0;i<5;i++)
{
printf("%s",str[i]);
}
free(str);
return 0;
}
Output
2413345
With this method you only need to free the allocated memory once.

scanning a line has strings and integer C

I have a project and im facing a problem in this code
void Show() {
system("cls");
FILE *AddedSc;
int sc1i,sc2i;
int sc1ii,sc2ii;
char TNi[100],TN2i[100];
char TNii[100],TN2ii[100];
AddedSc = fopen("addedscores.txt", "r");
printf(" - Choose teams from this list: \n\n");
printf(" 1. Brazil\n 2. Germany\n 3. Italy\n 4. KSA\n 5. Portogual\n 6. Australia\n 7. USA\n 8. Spin\n 9. England\n 10. Korea\n\n\n");
printf(" * Enter the two teams that you want to show their results: ");
printf("\n\n\nTeam A: ");
scanf("%s", TNi);
printf("Team B: ");
scanf("%s", TN2i);
while (fscanf(AddedSc,"%[^\n] %d %d %[^\n]", TNii, sc1ii, sc2ii,TN2ii) !=EOF) {
if (strcmp(TNi, TNii) == 0 && strcmp(TN2i, TN2ii) == 0)
printf("\n\n%s %d - %d %s", TNi, sc1ii, sc2ii, TN2i);
else if(strcmp(TN2i, TNii) == 0 && strcmp(TNi, TN2ii) == 0)
printf("\n\n%s %d - %d %s", TN2i, sc2ii, sc1ii, TNi);
else printf("Not found!");
}
fclose(AddedSc);
there is a file contains data like this
usa 2 0 italy
I want the user to enter the name of two teams and let the program to search in the file and compare what the user entered and print the result of the match on the screen ..
please help me in this....
The problem is the first format, %[^\n], which will eat up all the lines in the input. You can change it just %s as follows:
while (fscanf(AddedSc,"%s %d %d %s", TNii, sc1ii, sc2ii,TN2ii) != EOF)
And it will be safer to compare the result as:
while (fscanf(AddedSc,"%s %d %d %s", TNii, sc1ii, sc2ii,TN2ii) == 4)

linux terminal output

Hi I wrote a simple c prog to just accept a password while diplaying * to hide the input. But the * for the last character entered is not appearing at the right place.
the code is below
int main(){
int choice = 0;
char pass[8];
FILE *input;
FILE *output;
struct termios initial_settings, new_settings;
if(!isatty(fileno(stdout))){
fprintf(stderr,"Not a terminal \n");
}
input = fopen("/dev/tty","r");
output = fopen("/dev/tty","w");
if(!input || !output){
fprintf(stderr,"error opening");
exit(1);
}
tcgetattr(fileno(input),&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
new_settings.c_lflag &= ~ISIG;
if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {
fprintf(stderr,"could not set attributes\n");
}
int count = 0;
char ch;
printf("Please enter the password: ");
while (count<8){
ch = fgetc(input);
if(ch == '\n' || ch == '\r'){
break;
}else{
fputc('*',stdout);
pass[count] = ch;
count++;
}
tcdrain(fileno(stdout));
}
fprintf(output,"you have entered :%s \n",pass);
tcsetattr(fileno(input),TCSANOW,&initial_settings);
exit(0);
}
The output is as follows:
Please enter the password:* * * * * * *
you have entered :12345678
* pasman#pasman-laptop:~$
Its an 8 character password & Notice that 7 *s appear as expected but the last * is appearing at the end of main.
You're mixing stdio and another stream, output, talking directly to the tty. They have different buffers, and get flushed at different times. You really should just use one of them.
It's because you break before you write the last *: so
add
fputc('*',stdout);
before
tcdrain(fileno(stdout));

Resources