'I am writing C function that convert lowercase char to upper case char with using ASCII but Output is not correct

Okay, So I start working on this, I have code below;

+I also have strlen("any string here") func that return len of any str in decimal just keep in your mind.

I take a lover case let's say a, then a will be equal some decimal num in ASCII table then I subtract 32 to get A.

Sadly this is not working, any idea for this? Thank you for all help and your time!

int uppercase(char sent[]) {
    
 for(int i=0; i <= strlen(sent); ++i) {
        if(sent[i]>='a' && sent[i]<='z')
            sent[i] -= 32;
}


Solution 1:[1]

This one will work:

#include <stdio.h>
#include <string.h>

void uppercase(char sent[]) {
    for (int i = 0; i < (int)strlen(sent); i++) {
        if (sent[i] >= 'a' && sent[i] <= 'z') {
            sent[i] -= 32;
        }
    }
}

int main(int argc, char* argv[]) {
    if (argc > 1){
        uppercase(argv[1]);
        puts(argv[1]);
    }

    return 0;
}

It compiles without any errors and warnings (using clang), even with options -pedantic -Wall -Wextra.

Solution 2:[2]

The function is declared as having the return type int but returns nothing.

int uppercase(char sent[]) {
    
 for(int i=0; i <= strlen(sent); ++i) {
        if(sent[i]>='a' && sent[i]<='z')
            sent[i] -= 32;

}

In general for a function that deals with strings the condition of the for loop should look at least like

 for(int i=0; i < strlen(sent); ++i) {

Though it is better to write the loop like

 for( size_t i = 0, n = strlen(sent); i < n; ++i ) {

However there is no great sense to use the function strlen in the function uppercase. Its call is redundant.

Pay attention to that you may not change a string literal. Any attempt to change a string literal results in undefined behavior.

From the C Standard (6.4.5 String literals)

7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

Also it is better not to use the magic number 32.

The function can be written the following way as it is shown in the demonstrative program below.

#include <stdio.h>

char * uppercase( char *s )
{
    for ( char *p = s; *p; ++p )
    {
        if ( 'a' <= *p && *p <= 'z' ) *p = *p & ~' ';
    }
    
    return s;
}

int main(void) 
{
    char s[] = "hello world!";
    
    puts( s );
    puts( uppercase( s ) );
    
    return 0;
}

The program output is

hello world!
HELLO WORLD!

As for the function strlen then it is better to use another name for the function because it will conflict with the standard C function strlen. And the function itself can be defined the following way

size_t string_len( const char *s )
{
    const char *p = s;

    while ( *p ) ++p;

    return p - s;
}

Solution 3:[3]

This code can help you

#include <stdio.h>
#include <string.h>

void uppercase(char T[],int k)
{
      int i=0;
      while(i<k)
      {
           if(T[i]>='a'&&T[i]<='z')
           {
                 T[i]=(char)((int)T[i]-32);
           }
         i++;
      }
      i=0;
      while(i<k)
      {
            printf("%c",T[i]);
            i++;
      }
      printf("\n");
}

int main()
{
      char T[]="good morning !";
      int k=sizeof(T);
      uppercase(T,k);
}

Solution 4:[4]

/*
Parsing the string, then making the letters to uppercase.
*/

#include <stdio.h>
#include <limits.h>



int strlen(char s[]){ //String length function
    int i;
    for (i = 0; s[i] != '\0'; i++);
    return i;
}

void uppercase(char sent[]) {
    for(int i=0; i < strlen(sent); ++i) {
        if(sent[i]>='a' && sent[i]<='z')
            sent[i] += 32;
    }

 printf("%s", sent);
}

this is a whole tab of my whole work. when i try uppercase("hello world"); it giving me core dumped console problem.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Xaver
Solution 2
Solution 3 MED LDN
Solution 4 Barak