I have to find the vowels in an input string and return the string of the vowels in reverse order.
Example input: "woUIW"
The expected output is "IUOo"
But I cannot use pointers, only recursion.
This is my attempt:
void letters_revers(char s[])
{
int i = 0,g,len,right,left;
char reversed[10];
len=strlen(reversed)-1; // get the length of the string
left = 0; // set left index at 0
right = len - 1; // set right index len - 1
while(i!='\0')
{
if (s[i] == 'a' || s[i] == 'A' || s[i] == 'e' || s[i] == 'E' || s[i] == 'i' || s[i] == 'I' || s[i] =='o' || s[i]=='O' || s[i] == 'u' || s[i] == 'U')
{ reversed[i]+=s[i];
for(g = len - 1; g >= 0; g--)
{
printf("%c", reversed[g]);
}
}
}i++;
}
Related
I am getting an int of the entire string s for 'letter', the conditions in my 'if' statement seem to not be reading properly - is my syntax incorrect?
I get user input:
string s = get_string("Text here: ");
the function is as follows:
int letter_count(string s)
{
int i =0;
int len = strlen(s);
int letter = 0;
while(i < len)
{
if (s[i] != '\0' || s[i] != '.' || s[i] != ',' || s[i] != '!' || s[i] != '?')
{
letter++;
}
i++;
}
return letter;
}
then call the function:
int letter = letter_count(s);
printf("letter Count: %i\n", letter);
Try changing the OR operator with the AND
if (s[i] != '\0' || s[i] != '.' || s[i] != ',' || s[i] != '!' || s[i] != '?')
is ALWAYS true. Because any character is either not "." or not ",". Which letter would you expect to be both?
You want to check whether the current letter is "not ." AND "not ," AND "not !".
I.e.
if (s[i] != '\0' && s[i] != '.' && s[i] != ',' && s[i] != '!' && s[i] != '?')
Almost correct, you have to change the type of the argument to char*, there is no string type on the default libraries. (Documentation of string library).
Working example with the modifications:
#include <stdio.h>
#include <string.h>
int letter_count (char* s)
{
int i = 0;
int len = strlen (s);
int letter = 0;
while (i < len)
{
if (s[i] != '\0' && s[i] != '.' && s[i] != ',' && s[i] != '!'
&& s[i] != '?')
{
letter++;
}
i++;
}
return letter;
}
int main ()
{
char my_word[] = "Sample word";
printf ("'%s' have %d letters",my_word, letter_count (my_word));
return 0;
}
Output:
'Sample word' have 11 letters
I have to write a program that selects consonants from a string and counts them, and shows how many times each of them appeared.
I wrote this code, but it also counts vowels. I don't know why.
#include <stdio.h>
int main()
{
char str[100];
int i, consonants;
i = consonants = 0;
int freq[256] = {0};
printf("\n Please Enter any String : ");
scanf("%[^\n]", str);
while (str[i] != '\0')
{
if ((str[i] >= 'a' && str[i] <= 'z') ||
(str[i] >= 'A' && str[i] <= 'Z') &&
(str[i] != 'a' || str[i] != 'A' ||
str[i] != 'e' || str[i] != 'E' ||
str[i] != 'i' || str[i] != 'I' ||
str[i] != 'o' || str[i] != 'O' ||
str[i] != 'u' || str[i] != 'U'))
{
consonants++;
freq[str[i]]++;
}
i++;
}
printf("\n Number of Consonants in this String = %d", consonants);
for (i = 0; i < 256; i++)
{
if (freq[i] != 0)
{
printf("\nThe frequency of %c is %d", i, freq[i]);
}
}
return 0;
}
This is output:
Please Enter any String : We strive to achive peace
Number of Consonants in this String = 21
The frequency of W is 1
The frequency of a is 2
The frequency of c is 2
The frequency of e is 5
The frequency of h is 1
The frequency of i is 2
The frequency of o is 1
The frequency of p is 1
The frequency of r is 1
The frequency of s is 1
The frequency of t is 2
The frequency of v is 2
I just wanted to let you know that you can get rid of the huge if condition by using the standard functions isalpha(), defined in ctype.h, and strchr(), defined in strng.h.
You can change the whole condition to just
if( isConsonant(str[i]) )
With isConsonant() defined as follows
int isConsonant( char c )
{
static char vowels[] = "aeiouAEIOU";
if( ialpha(c) && strchr(vowels, c) == NULL ) {
return 1;
}
else {
return 0;
}
}
This part of your condition (which because of the rest of the logic influences the whole outcome) will always be true:
str[i] != 'a' || str[i] != 'A'
That is why all letters are counted as consonants.
You want the negation of "is a vowel".
!(str[i] == 'a' ||
str[i] == 'A' ||
str[i] == 'e' ||
str[i] == 'E' ||
str[i] == 'i' ||
str[i] == 'I' ||
str[i] == 'o' ||
str[i] == 'O' ||
str[i] == 'u' ||
str[i] == 'U')
which is "not(that or that or that)"
or
the logically equivalent
"not that and not that and not that".
(str[i] != 'a' &&
str[i] != 'A' &&
str[i] != 'e' &&
str[i] != 'E' &&
str[i] != 'i' &&
str[i] != 'I' &&
str[i] != 'o' &&
str[i] != 'O' &&
str[i] != 'u' &&
str[i] != 'U')
Note, I chose to discuss the logic of your code, assuming that it is interesting for you and helpful for your learning. However, I really like the other answer too, which is strong on the wheel-not-inventing philosophy. I won't explain, look there.
Full logic:
if ( ( (str[i] >= 'a' && str[i] <= 'z') ||
(str[i] >= 'A' && str[i] <= 'Z')
)
/* a letter */
&&
/* not a vowel */
( str[i] != 'a' && str[i] != 'A' &&
str[i] != 'e' && str[i] != 'E' &&
str[i] != 'i' && str[i] != 'I' &&
str[i] != 'o' && str[i] != 'O' &&
str[i] != 'u' && str[i] != 'U'
)
)
Without the additional pair of () around "is a letter" you would get
"is a lower case or is an upper case consonant",
i.e. would still be counting lower case vowels.
You just change
||(str[i] >= 'A' && str[i] <= 'Z')
&&(str[i] != 'a' || str[i] != 'A'
||str[i] != 'e' || str[i] != 'E'
||str[i] != 'i' || str[i] != 'I'
||str[i] != 'o' || str[i] != 'O'
||str[i] != 'u' || str[i] != 'U'))
to
&&(str[i] != 'a'
&& str[i] != 'A'
&&str[i] != 'e'
&& str[i] != 'E'
&& str[i] != 'i'
&& str[i] != 'I'
&& str[i] != 'o'
&& str[i] != 'O'
&& str[i] != 'u'
&& str[i] != 'U'))
my code:
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
int i=0, consonants=0;
int vowels=0,numbers=0;
int freq[256] = {0};
printf("\n Please Enter any String : ");
scanf("%[^\n]", str);
vowels=0,numbers=0,i=0;
while (str[i] != '\0')
{
if((str[i]>= 'a'&&str[i]<= 'z') || (str[i] >= 'A' && str[i] <= 'Z')&&(str[i] != 'a' && str[i] != 'A' &&str[i] != 'e'&& str[i] != 'E' && str[i] != 'i' && str[i] != 'I' && str[i] != 'o' && str[i] != 'O'&& str[i] != 'u' && str[i] != 'U'))
{
consonants++;
freq[str[i]]++;
}
i++;
}
printf("\n Number of Consonants in this String = %d", consonants);
printf("\n\n");
for (i = 0; i < 256; i++)
{
if (freq[i] != 0)
{
printf("\nThe frequency of %c is %d", i, freq[i]);
}
}
printf("\n\n");
return 0;
}
I am constructing a program that takes string input from the keyboard then shows the number of consonants as an output. I have managed to do it in a ridiculous way in the function count_consonants. I tested using if statement whether each character in the input is a number or symbol to ignore them during calculations. I originally wanted to check if the string is not a string using fgets but I don't know how. That's not an effective way, so any ideas for this?
#include <stdio.h>
#include <string.h>
//function to calculate the consonants
int count_consonants(char str[]) {
int idx;
for (idx = 0; idx < 100; ++idx) {
if (str[idx] == '\0') {
break;
}
}
int vowl = 0;
for (int i = 0; i < idx; ++i) { //loop to check if the characters are vowels or not
if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o'
|| str[i] == 'u' || str[i] == 'A' || str[i] == 'E' || str[i] == 'I'
|| str[i] == 'O' || str[i] == 'U' || str[i] == ' ') {
vowl += 1;
}
// numbers and symbols are counted here as vowels because if not,
// the compiler will count them the other way around
if (str[i] == '1' || str[i] == '2' || str[i] == '3' || str[i] == '4'
|| str[i] == '5' || str[i] == '6' || str[i] == '7' || str[i] == '8'
|| str[i] == '9') {
vowl += 1;
}
if (str[i] == ':' || str[i] == ',' || str[i] == '.' || str[i] == '$'
|| str[i] == '%' || str[i] == '^' || str[i] == '&' || str[i] == '*'
|| str[i] == '#' || str[i] == '_' || str[i] == '!') {
vowl += 1;
}
}
int cons = idx - vowl; // consonants = whole length of text - vowels
return cons - 1;
}
int main(int argc, char const *argv[]) {
char string[100];
char store[100][100];
int i = 0;
while (string[0] != '\n') {
fgets(string, 100, stdin);
strcpy(store[i], string);
i++;
}
for (int j = 0; j < i - 1; ++j) {
/* code */
printf("Number of consonants=%d\n", count_consonants(store[j]));
}
return 0;
}
shows the number of consonants
A simply way to count consonants, use isalpha(), strchr()
#include <string.h>
#include <ctype.h>
int my_isavowel(char ch) {
const char *p = strchr("aeiouAEIOU", ch); // search for a match
return p && *p; // If p is not NULL, and does not point to \0
}
int count_consonants(const char str[]) {
int count = 0;
while (*str != '\0') { // while not at end of string ...
char ch = *str++; // Get character and advance
count += isalpha((unsigned char) ch) && !my_isvowel(ch);
}
return count;
}
If you look for number of consonants, simply best count consonants instead of other things
#include <stdio.h>
#include <string.h>
int main (int narg,char*args[]){
char cons[ ] = "ZRTPQSDFGHJKLMWXCVBN";
char sentence[ ] = "This is my sentence!";
int i=0;
int sum_cons = 0;
for (i = 0; i < strlen(sentence); ++i)
if (strchr(cons,strupr(sentence)[i])) sum_cons++;
printf ("#CONS>%i\n",sum_cons);
return 0;
}
Here is my function to remove the vowels in a string;
char *removeVowels(char *inString) {
int count = 0; //to count the non vowel characters
for (int i = 0; inString[i]; i++)
if (inString[i] != 'a' || inString[i] != 'e' || inString[i] != 'u' || inString[i] != 'o' || inString[i] != 'i')
inString[count++] = inString[i]; //if character is not a vowel placed at count++
inString[count] = '\0';
return inString;
}
The problem is that it is returning the original string inputted. Any ideas?
There is a confusion between the || and && operators. You want to test that the character is different from 'a' AND different from 'e' etc.
Here is a modified version:
char *removeVowels(char *inString) {
int count = 0; // index for preserved characters
for (int i = 0; inString[i]; i++) {
if (inString[i] != 'a' && inString[i] != 'e' && inString[i] != 'i'
&& inString[i] != 'o' && inString[i] != 'u') {
inString[count++] = inString[i]; // copy the non-vowel character
}
}
inString[count] = '\0'; // set the null terminator.
return inString;
}
Note however that uppercase vowels are not removed by this function, and whether y should be considered a vowel remains to be decided.
As stated in another comment, you need to use && instead of || to make sure that the character does not match any vowels. It might be easier to create a new string and add non-vowels to that string as you go. Something like:
char *removeVowels(char *inString, int size){
char newString[size];
int count = 0;
for(int i = 0; i < size; i++){
if(inString[i] != 'a' && inString[i] != 'e' && inString[i] != 'i' && inString[i] != 'o' && inString[i] != 'u'){
newString[count] = inString[i];
count++;
}
}
newString[count] = '\0';
return newString;
}
I'm having difficulties with a program I've been instructed to write. The program should search a word for the first vowel that appears, it then should print out the index of that vowel. If there are no vowel's, it should return -1.
This is my code so far:
int firstVowel(char* string){
//Variable for case with no vowels
int notInString = -1;
int length = strlen(string);
int i;
for(i = 0; i <= length; i+=1){
if(*string == 'a' || *string == 'e' || *string == 'i' ||
*string == 'o' || *string == 'u'){
return i;
}
else if(*string != 'a' || *string != 'e' || *string != 'i' || *string != 'o' ||
*string != 'u') {
return notInString;
}
}
}
When I run it with the input "abced" it returns 0 correctly. However, when I run it as fsed it returns -1 incorrectly.
You loop does not increment string and always returns after doing the first comparison, you want
int firstVowel(char* string) {
//Variable for case with no vowels
int notInString = -1;
int length = strlen(string);
int i;
for (i = 0; i <= length; i += 1) {
if (*string == 'a' || *string == 'e' || *string == 'i' ||
*string == 'o' || *string == 'u') {
return i;
} else {
string++;
}
}
return notInString;
}
This will search the entire array, returning the index of the first vowel it sees. It cannot return notInString until it has processed the entire string.