3

I am trying to write a program which will only compare same case letter, but first it should convert any case to a particular case.

But I am having trouble converting the string to any particular case using a function, though I have figured out how to do that without a function. Here's my code. Can anyone help me find out where I am going wrong?

#include<stdio.h>
#include<string.h>
void order(char input[])
{
    int i=0;

    while(input[i]!='\0')
    {
        if(input[i]>'65' && input[i]<'92')
        {
            input[i]+=32;
           // printf("WORKING\n");
        }

        i++;

    }
}
int main()
{
    char input1[101], output1[101];
    char input2[101], output2[101];
    int r;

    scanf("%s",tolower(input1));
    scanf("%s",input2);

    order(input1);
    order(input2);

    printf("%s\n",input1);
    printf("%s\n",input2);

    /*

    r=strcmp(output1,output2);


    if(r<0)
        printf("-1\n");
    else if(r>0)
        printf("1\n");
    else
        printf("0\n");

    */

}

3 Answers 3

4

Change this:

if(input[i]>'65' && input[i]<'92')

to this:

if(input[i] >= 65 && input[i] <= 90)

since you want to check for the ASCII codes of A and Z. Notice that because you used magic numbers, you made a mistake for both. I had to check an ASCII table to figure that out that you needed the equality sign as well, and 90 (code for Z), instead of 92 (code for '\').

I suggest you then to use characters constants, like this:

if(input[i] >= 'A' && input[i] <= 'Z')
Sign up to request clarification or add additional context in comments.

8 Comments

output is showing same string like the inserted one
Yes @mahinhossen I understand that. I am asking what would you like the function to do a given string. For example, if I give "FOO" to your function, what would you like the output to be?
i want the function to convert in any case,as given example i want it to convert it to lowercase,got the answer,thanks though.My syntax was wrong
Not only clearer to use the character constants, but now also more portable. Everyone's a winner!
@TobySpeight The "more portable" gets into deeper issues. 1) Aside from ubiquitous ASCII, using 'A' with EBCDIC, does not help as [A-Z] is not continuous, so the if() is broken code. 2) The character encoding of source code and encoding file characters may differ. Still for learners, 'A' vs 65 is best.
|
4

Constant and off-by-1 errors.

  • '65' is a multi byte constant and certainly 65 was meant. @gsamaras. ASCII Z is 90.

    // if(input[i]>'65' && input[i]<'92')
    if(input[i]>65 && input[i]< Zee)
    
  • Off by 1 due to > vs. >=

    // if(input[i]>'65' && input[i]<'92')
    // if(input[i]>65 && input[i]< Zee)
    if(input[i] >= 65 && input[i] <= 90)
    

Character constants are more self documenting. Consider 'A'

    if(input[i] >= 'A' && input[i] <= 'Z')

Ideally code would use standard C library functions to detect case.

    if(isupper((unsigned char) input[i]))

Yet code could call toupper() directly and skip the if().

while(input[i]) {
  input[i] = tolower((unsigned char) input[i]);
  i++;
}

// or 

for (size_t i = 0; input[i]; i++) {
  input[i] = tolower((unsigned char) input[i]);
}

Comments

1

You're trying to pass a char* to the tolower in scanf("%s",tolower(input1));.

Change it to scanf("%s", input1);

c - convert a mixed-case string to all lower case should tell you how to convert a string to lower case.

Take a look at https://linux.die.net/man/3/tolower and https://linux.die.net/man/3/toupper.

1 Comment

sorry,was trying to do that so that it can take string as lowercase,but it didn't work.forgot to change it while posting here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.