I am very new to C / C and I am learning the basics. I want to write a program that prints the number of vowels as vowCount
in a person's name that is an input. I have two char
arrays, name[20]
to hold the string
input from the user and vowels[]
to hold vowels.
I want vowCount
to increase by 1 if two char
s match between the arrays. If I input name
as "John", the nested for-loop
, vowels[i]
prints a,e,i,o,u,J,o,h,n
. What is my mistake here and I don't understand why vowels[i]
also prints elements from name[20]
? And vowCount
is always the same as the size of name[]
, including the null
pointer at the end of the string.
#include <stdio.h>
#include <string.h>
using namespace std;
int main() {
char name[20];
char vowels[] = {'a','e','i','o','u'};
int vowCount = 0;
printf("Enter your name: ");
scanf("s",name);
for(uint16_t counter = 0; name[counter]!= '\0' ;counter ){
char test = name[counter];
printf("CHECKING: %c \n", test);
for(uint8_t i =0; vowels[i] != '\0'; i ){
printf("COMPARING WITH VOWEL: %c\n", vowels[i]);
if(test == vowels[i]){
vowCount ;
}
}
}
printf("\n%i", vowCount);
}
CodePudding user response:
This array
char vowels[] = {'a','e','i','o','u'};
does not contain a string: a sequence of characters terminated by the zero character '\0'
.
As a result this for loop
for(uint8_t i =0; vowels[i] != '\0'; i ){
invokes undefined behavior because neither element of the array vowels
is equal to '\0'
.
Instead you could declare the array either like
char vowels[] = {'a','e','i','o','u', '\0' };
or you could use a string literal to initialize the array
char vowels[] = { "aeiou" };
that is the same as
char vowels[] = "aeiou";
Pay attention to that in C there are no namespaces. If you want to write a C program then remove this line
using namespace std;
Also neither declaration from the header <string.h>
is used in your program.
A C program can look the following way
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main( void )
{
char name[20];
const char vowels[] = "aeiou";
size_t vowCount = 0;
printf("Enter your name: ");
scanf( "s", name );
for ( size_t i = 0; name[i]!= '\0' ; i )
{
unsigned char c = name[i];
printf("CHECKING: %c \n", c );
if ( strchr( vowels, tolower( c ) ) != NULL )
{
vowCount ;
}
}
printf( "\n%zu\n", vowCount );
}