Counting number of vowels and consonants in a string - c

I keep on getting a [Linker error]C:\Users etc and collect2: Id returned 1 exit status code errors on my program but I don't see anything wrong with it. This is my program:
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main (){
int vowels = 0, cnsnts = 0;
int i, length;
char string[100];
printf("Enter sentence:");
gets(string);
length = strlen(string);
for(i = 0; i < length; i++){
switch(toUpper(string[i])){
case 'A':
vowels++;
break;
case 'E':
vowels++;
break;
case 'I':
vowels++;
break;
case 'O':
vowels++;
break;
case 'U':
vowels++;
break;
default:
cnsnts++;
}
}
printf("The number of vowels are %d.\n", vowels);
printf("The number of consonants are %d.\n", cnsnts);
system("pause");
return 0;
}

Change
toUpper(string[i])
to
toupper(string[i])
add <ctype.h> header and turn on your compiler warnings.

First add
#include <ctype.h>
then change the camel case toUpper like so
toupper(string[i])

You must #include <ctype.h> and have mistakenly capitalized the u in upper. Your switch could also stand to be brought down a bit
switch(toupper(string[i])) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
vowels++;
break;
default:
cnsnts++;
}
This style takes advantage of fall-throughs. If a case doesn't end with a break (or return, continue, or goto) it will enter the case below it. This continues until a control flow altering keyword is hit. The switch above is functionally equivalent to your original, but a lot shorter.
You might also consider checking that string[i] is a letter at all with isalpha before the switch
if (!isalpha(string[i])) continue;

Related

Can we call a 'Case' of Switch(); statement from anywhere else in the code [C Programming Language]

here is a demo code for explaining what I'm actually looking for
I want to call a 'case' of "switch" - statement from somewhere else in the code in C Language.
Here is the source code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
char a;
int main()
{
printf("Enter a number: ");
scanf("%c", &a);
switch(a){
case 'a':
printf("This is for A & C");
break;
case 'b':
printf("This is for only B");
break;
case 'c':
// Here i want to call "case 'a':"
goto case 'a';
// how can a call another case here?
break;
default:
printf("Default");
break;
}
getch();
return 0;
}
Thanks is Advance :D
You need the so-called "fall-through" case:
So instead of this:
case 'a':
printf("This is for A & C");
break;
case 'b':
printf("This is for only B");
break;
case 'c':
// Here i want to call "case 'a':"
Write this:
case 'a':
case 'c':
printf("This is for A or C");
break;
case 'b':
printf("This is for only B");
break;

Why this switch case goes to the default case?

The code is supposed to check for a vowel input. If found, it would print "Vowel" and if there is none it should print "consonent". But the compiler is going to the default case regardless of the input and I can't find where the mistake is. Please Help.
Here's my code:
#include<stdio.h>
void main()
{
char ch;
printf("Insert a Char \n");
scanf("%d", &ch);
switch(ch)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("Vowel");
break;
default:
printf("Consonent");
}
}
The conversion specifier %d in this call
scanf("%d", &ch);
is invalid. It tries to read a number. So entering a letter like 'A' results in input error.
The compiler can issue a warning or even an error reporting that for example
format ‘%d’ expects argument of type ‘int *’, but argument 2 has type
‘char *’
Because using an invalid format can result in undefined behavior.
Here is a demonstrative program
#include <stdio.h>
int main(void)
{
char s[] = "ABCD";
puts( s );
scanf( "%d", ( int * )s );
puts( s );
return 0;
}
If for example even to enter a valid ASCII code as for example 65 of the letter 'A' then the program output might look like
ABCD
A
That is the memory occupied by the array was overwritten.
Instead use the following call.(if you want to skip white spaces)
scanf( " %c", &ch );
or the following call
scanf( "%c", &ch );
Pay attention to that according to the C Standard the function main without parameters shall be declared like
int main( void )
First thing %d accepts an integer, not a character so correct this and run then place break after each case ends if you don't place break it will run all case till the end which is the default.
Example:-
char ch;
printf("Insert a Char \n");
scanf("%c", &ch);
switch(ch)
{
case 'a':printf("Vowel");
break;
case 'e':printf("Vowel");
break;
case 'i':printf("Vowel");
break;
case 'o':printf("Vowel");
break;
case 'u':
printf("Vowel");
break;
default:
printf("Consonent");
}
Hope it will help.
Happy coding :-)
you should use "%c" as the format. when you use "%d", the value is 0 (because no integers have been detected in the input string). Refer to https://en.cppreference.com/w/c/io/fscanf#Example.
This issue, and void main() instead of int main(), should produce a compiler warning.
Thanks Everyone. I appreciate the help!
I should have noticed the data type though.
include
void main()
{
char ch;
printf("Insert a Char \n");
scanf("%c", &ch);
switch(ch)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
printf("Vowel");
break;
default:
printf("Consonant");
}
}

why does "type mismatch in redeclaration of hexadecimal" keep popping up?

I am a totally newbie about C programming. so my program is very long, sorry.
my professor wants to have a number system- binary to decimal, decimal to binary, octal to decimal, hexadecimal to binary. he also want to have a loop( if he wants to exit press [E], if not then press any key). Now i'm having a problem with this hexadecimal because it keeps saying " type mismatch in redeclaration" and i don't know now how to solve this problem.
so heres my not yet finished program because of "hexadecimal" problem. help me with this error. don't mind the octal to decimal, I am currently programming it :)
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 1000
long num, decimal(long), octal(long), binary(long),j;
char hexadecimal(char), k[MAX];
main()
{
char choice;
clrscr();
printf("[B]inary to Decimal\n");
printf("[D]ecimal to Binary\n");
printf("[O]ctal to Decimal\n");
printf("[H]exadecimal to Binary\n");
printf("[E]xit\n");
printf(" Enter your choice....");
choice=getche();
switch(choice)
{
case 'b':
case 'B': binary(j); break;
case 'd':
case 'D': decimal(num); break;
case 'o':
case 'O':
case 'h':
case 'H': hexadecimal(k[MAX]); break;
case 'e':
case 'E': return 0;
default: printf("\n Invalid choice.... press any key to REPEAT");
getch();
main();
}
printf("\nDo you want to [E]xit?");
choice=getch();
switch(choice)
{
case 'e':
case 'E': printf("\nInvalid choice... press any key to repeat");
getch();
main();
}
getch();
return 0;
}
long binary(long j)
{
long binary_val,decimal_val=0, base=1, rem;
printf("Enter a binary number( 1s & 0s): ");
scanf("%ld",&j);
binary_val=j;
while(j>0)
{
rem=j % 10;
decimal_val=decimal_val + rem * base;
j= j/ 10;
base=base * 2;
}
printf(" The Binary Number is %ld\n",binary_val);
printf(" Its decimal equivalent is = %d\n",decimal_val);
}
long decimal(long num)
{
long decimal_num, remainder, base=1, binary=0;
printf(" \nEnter a decimal integer: ");
scanf("%ld",&num);
decimal_num=num;
while(num>0)
{
remainder= num % 2;
binary=binary + remainder * base;
num=num/2;
base= base * 10;
}
printf(" Input number is %d\n",decimal_num);
printf(" Its binary equivalent is = %ld",binary);
}
char hexadecimal(char k[MAX])
{
long int i=0;
clrscr();
printf(" Enter any Hexadecimal number: ");
scanf("%s",&k);
printf("\n Equivalent binary value: ");
while(k[i])
{
switch(k[i])
{
case '0': printf("0000"); break;
case '1': printf("0001"); break;
case '2': printf("0010"); break;
case '3': printf("0011"); break;
case '4': printf("0100"); break;
case '5': printf("0101"); break;
case '6': printf("0110"); break;
case '7': printf("0111"); break;
case '8': printf("1000"); break;
case '9': printf("1001"); break;
case 'a':
case 'A': printf("1010"); break;
case 'b':
case 'B': printf("1011"); break;
case 'c':
case 'C': printf("1100"); break;
case 'd':
case 'D': printf("1101"); break;
case 'e':
case 'E': printf("1110"); break;
case 'f':
case 'F': printf("1111"); break;
default: printf("\n Invalid hexadecimal digit %c",k[i]); return 0;
}
i++;
}
}
The error you are getting type mismatch in redeclaration of hexadecimalis a result of the difference between the function you prototyped and implemented.
Your prototype is:
char hexadecimal(char), k[MAX];
This line prototypes a function hexadecimal that returns a char and takes a char as an argument AND this line also declares a global char array k of size MAX.
Your actual function is:
char hexadecimal(char k[MAX])
This function is a function that returns a char, but instead of taking a char like your prototype it instead takes a char array of size MAX. As you can see the prototyped function and the function itself are not the same. By making the functions exactly the same you will fix your issue.
To be honest, you don't need to pass anything into that function nor make a global char array as you can locally hold the array based on your code. The only other time you use the array you just pass it to this function which means it is better of as a local to that function anyway. So, you can simply do this:
char hexadecimal(void)
{
char k[MAX]
//same code below...
Now the function takes no arguments and k is still declared in the function, but is local instead of global. The prototype for this function would simply be:
char hexadecimal(void);

DNA replication program generating wrong output

What is the problem with that code, I just want to replace the DNA's bases.:
#include <stdio.h>
int getDna(){
int i,t;
printf("How many protein does the DNA have?");
scanf("%d",&t);
char dnaPtn[t],rDnaPtn[t];
printf("Enter the DNA: ");
scanf("%s",&dnaPtn);
for(i=0;i<t;i++){
switch(dnaPtn[i]){
case 'a':
rDnaPtn[i] = "t";
break;
case 'c':
rDnaPtn[i] = "g";
break;
case 'g':
rDnaPtn[i] = "c";
break;
case 't':
rDnaPtn[i] = "a";
break;
default:
break;
}
}
printf("%s",rDnaPtn);
}
int main(){
getDna();
return 0;
}
The output of agcta is:
How many protein does the DNA have: 5
Enter the DNA: agcta
^b'd^!!#
What is wrong?
In your code,
rDnaPtn[i] = "t";
should be
rDnaPtn[i] = 't';
as the "" denotes a string but what you want is of type char.
After that,
don't forget to null-terminate your destination array.
scanf("%s",&dnaPtn); can be re-written as scanf("%s",dnaPtn);
Don't loop over the entire array. make use of strlen().
Enable compiler warnings.

How can I make switch-case statements case insensitive?

How can I make a switch-case statement to not be case sensitive?
Say I made something like this:
#include <stdio.h>
char choice;
int main ()
{
char choice;
printf("Will you choose A,B, or C?\n>");
scanf(" %c", &choice);
switch(choice)
{
case 'A':
printf("The First Letter of the Alphabet");
break;
case 'B':
printf("The Second Letter of the Alphabet");
break;
case 'C':
printf("The Third Letter of the Alphabet");
break;
}
}
It would only respond to capital letters. How do I make it respond to lower case letters?
toupper in <ctype.h> converts a character to uppercase:
#include <stdio.h>
#include <ctype.h>
char choice;
int main ()
{
printf("Will you choose A,B, or C?\n>");
scanf(" %c", &choice);
switch(toupper(choice)) // Changed line
{
case 'A':
printf("The First Letter of the Alphabet");
break;
case 'B':
printf("The Second Letter of the Alphabet");
break;
case 'C':
printf("The Third Letter of the Alphabet");
break;
}
You simply need this :-
switch(choice)
{
case 'A':
case 'a':
printf("The First Letter of the Alphabet");
break;
case 'B':
case 'b':
printf("The Second Letter of the Alphabet");
break;
case 'C':
case 'c':
printf("The Third Letter of the Alphabet");
break;
}
and so on to continue your series.
Actually,what it does is that it bypasses(skims) upto bottom until it finds the first break statement matching the case thereby executing all the cases encountered in between!!!
Before the switch(), add:
choice = toupper(choice);
And if you haven't already got it, #include <ctype.h> to get the prototype.
You can give 2 cases one by one,
switch(choice)
{
case 'A':
case 'a':
printf("The First Letter of the Alphabet");
break;
case 'B':
case 'b':
printf("The Second Letter of the Alphabet");
break;
case 'C':
case 'c':
printf("The Third Letter of the Alphabet");
break;
}

Resources