0
Help please
Write your own C reverse_upper function that: takes the supplied input string (in) of a specified length (in_len) AND converts just the lowercase characters to uppercase AND returns the string in reverse order Please do this without using: toupper(), strupr(), strrev(), if, switch or the ? Operator https://code.sololearn.com/crz8oCAg4DZS/?ref=app
18 Answers
+ 3
ONGE as Hima pointed out, the loop end condition needs to be i>=0.
Also remove the & from the &test_str scanf() argument. The array gets translated as a pointer already.
To convert to lowercase (LC), first recognize that the difference between UC and LC letters is that their ASCII values differ by 32. In binary that is bit 5. The trick is to force bit 5 to 0 for uppercase. However, if the input string contains characters besides letters, i.e., spaces, numbers or punctuation, then it requires conditionals.
In order to accept all input strings without using an 'if' statement or ternary operator, you may still use conditional expressions, which evaluate to either 1 or 0. Multiply that by 32 and then you can conditionally flip the bit. Here are three ways:
printf("%c",c^(32*(c>='a' && c<='z')));
printf("%c",c&~(32*(c>='a' && c<='z')));
printf("%c",c - 32*(c>='a' && c<='z'));
+ 2
ONGE
That can be implemented using bitwise operators .
Moreover, your loop is wrong. It should run till i>=0.
#include <string.h>
#include<stdio.h>
int main() {
char str[]="sffaFssF";
for(int i=strlen(str)-1;i>=0;i--)
{
printf("%c",str[i]^32);
}
return 0;
}
+ 1
Hima,
Try with a sample string containing digits and spaces.
"It all began in December 2019."
+ 1
Ipang
In python3:
str=input()
dct={'a':'A','b':'B','c':'C','d':'D','e':'E','f':'F','g':'G','h':'H','i':'I','j':'J','k':'K','l':'L','m':'M','n':'N','o':'O','p':'P','q':'Q','r':'R','s':'S','t':'T','u':'U','v':'V','w':'W','x':'X','Y':'y','z':'Z'}
for i in str:
print(dct.get(i,i),end='')
Now, the same can be implemented in C.
+ 1
Hima,
That is different approach, no bitwise XOR usage in this new snippet. I was referring to the use of bitwise XOR in your original solution, where the alphabets are flip-cased.
+ 1
Martin Taylor You are absolutely right with your point but doesn't that subdue your creativity :).
+ 1
Hima,
Yes, Brian gave an excellent solution there!
Idk whether or not islower() was allowed, but if it is, it would also help in switching the characters' case.
+ 1
Ipang Technically , islower does make use of if statement. 😁
+ 1
Hima,
This is from ctype.h copy in C4Droid. Idk if the definition may have been updated, but in that file it seems to be implemented as macro.
#define islower(a) (0 ? islower(a) : ((unsigned)(a)-'a') < 26)
But you are right, it uses ternary conditionals there, so I'd say it's out of question 😁
+ 1
Ipang 😂😂 haha
+ 1
Brian without if-else
I don't know 😂😂
0
We can get away without `toupper()`, `strupr()`, `strrev()`, `switch`.
But without `if`and not even ternary operator, I ask you then, how would you verify whether a char was a lowercase alphabet?
0
Hey here is a solution,
Hope it will help you .
#include <stdio.h>
#include <string.h>
void reverse_str(char a[])
{
for (int i=strlen(a)-1;i>=0;i--)
{
if((97<(int)a[i])&&((int)a[i] <123))
printf("%c",a[i]-32);
else
printf("%c",a[i]);
}
}
int main(){
char test_str[50];
fgets(test_str ,sizeof(test_str),stdin);
reverse_str(test_str);
return 0;
}
0
@Deepesh patel, Please explain what you did in detail. I beg.
0
Deepesh Patel in case you missed it, there are requirements to "... do this without using: toupper(), strupr(), strrev(), if, switch or the ? Operator".
0
Mohale Lepheane
I just use ASCII values of characters in comparison.
Every character has an ASCII value of int type.you may search google for it.
For A-Z it is 65 to 90
For a-z it is 97 to 122
0
Deepesh Patel to date, the proposed solutions are to use a lookup table or use Boolean expressions. See the examples in prior replies to learn more.