cscopec-stringsfunction-definitiontoupper

Getting no output why is that?


I', learning C and I'm getting no output for some reason, probably I don't return as I should but how I should? (described the problem in the comments below :D) Any help is appreciated!

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

char *makeUpperCase (char *string);

int main()
{
    printf(makeUpperCase("hello")); //Here there is no output, and when I'm trying with the format %s it returns null
    return 0;
}

char *makeUpperCase(char *string)
{
    char str_out[strlen(string) + 1];
    for (int i = 0; i < strlen(string); ++i)
        str_out[i] = toupper(string[i]);

    printf(str_out); //Here I get the output.
    return str_out;
}

Solution

  • You declared within the function a local variable length array that will not be alive after exiting the function

    char str_out[strlen(string) + 1];
    

    So your program has undefined behavior.

    If the function parameter declared without the qualifier const then it means that the function changes the passed string in place. Such a function can be defined the following way

    char * makeUpperCase( char *string )
    {
        for ( char *p = string; *p != '\0'; ++p )
        {
            *p = toupper( ( unsigned char )*p );
        }
    
        return string;
    }
    

    Otherwise you need to allocate dynamically a new string. For example

    char * makeUpperCase( const char *string )
    {
        char *str_out = malloc( strlen( string ) + 1 );
    
        if ( str_out != NULL )
        { 
            char *p = str_out;
    
            for ( ; *string != '\0'; ++string )
            {
                *p++ = toupper( ( unsigned char )*string );
            }
    
            *p = '\0';
        }
    
        return str_out;
    }
    

    Here is a demonstration program.

    #include <stdop.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *makeUpperCase( const char *string )
    {
        char *str_out = malloc( strlen( string ) + 1 );
    
        if (str_out != NULL)
        {
            char *p = str_out;
    
            for (; *string != '\0'; ++string)
            {
                *p++ = toupper( ( unsigned char )*string );
            }
    
            *p = '\0';
        }
    
        return str_out;
    }
    
    int main( void )
    {
        char *p = makeUpperCase( "hello" );
    
        puts( p );
    
        free( p );
    }
    

    The program output is

    HELLO