1

I have been trying to solve this issue for whole day, and could not do it on my own. Searching the internet didn't help me solve it either

So, this the function prototype:

void invert(char **arr, int n);

First argument is an array of strings, and the second one is number of strings in an array.

This is my code:

#include <stdio.h>
#include <string.h>
void invert(char** arr, int n)
{
    int i, j, len;
        for(j=0;j<n;j++)
        {
            len=strlen(arr[j]);
             for(i=0;i<len/2;i++)
                {
                    char tmp = arr[j][i];             
                    arr[j][i] = arr[j][len - i - 1]; 
                    arr[j][len - i - 1] = tmp; 
                }
        }
}
int main()
{
    int n=3, i;
    char **arr;
    arr[0]="John";
    arr[1]="Doe";
    arr[2]="Programmer";
    invert(arr, n);
    for(i=0;i<3;i++)
    {
        printf("%s ",arr[i]);
    }
}

The code breaks when it reaches the line:

arr[j][i] = arr[j][len - i - 1];

and I can't figure out why. The function receives an array of strings perfectly (tested it with some printf statements for characters of specific strings), and the char tmp succesfully recieves a correct character, but the program crashed when it reaches the line mentioned earlier. Printf statements after that line don't work.

Did I miss anything? Can someone explain what am I doing wrong? Thank you!

4
  • 1
    What do you want to do? Please explain. What do you mean with to reverse a string? Do you want to reverse the string "John" to "nhoJ"? Commented Apr 8, 2022 at 19:36
  • Yes, I am trying to reverse every string. I want the output to be nhoJ eoD remmargorP Commented Apr 8, 2022 at 19:40
  • 1
    you need to allocate space for arr before writing to it. Failing to do so invokes undefined behavior Commented Apr 8, 2022 at 19:43
  • 2
    The C standard does not define the behavior when a program attempts to modify the contents of a string literal. Create separate arrays and copy the string literals into them, then reverse the strings in those arrays. Commented Apr 8, 2022 at 19:43

2 Answers 2

3

For starters this code snippet

char **arr;
arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

invokes undefined behavior because the pointer arr is uninitialized and has an indeterminate value.

Moreover this approach in any case is wrong because you may not change string literals.

What you need is to declare a two-dimensional array as for example

enum { N = 11 };

//...

char arr[3][N] =
{
    "John", "Doe", "Programmer"
};

In this case the function declaration will look like

void invert( char arr[][N], int n );

The enumeration must be declared before the function declaration.

Instead of the two-dimensional array you could declare an array of pointers like

char s1[] = "John";
char s2[] = "Doe";
char s3[] = "Programmer";
char * arr[3] = { s1, s2, s3 };

In this case the function declaration may be as shown in your question

void invert(char** arr, int n)

So what you need to do with minimal changes is to substitute this code snippet

char **arr;
arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

for this code snippet

char s1[] = "John";
char s2[] = "Doe";
char s3[] = "Programmer";
char * arr[3] = { s1, s2, s3 };
Sign up to request clarification or add additional context in comments.

Comments

2

To begin with, what you have here:

   char **arr;

is a pointer to pointer to char.

Secondly, even if you had an array of pointers to char, like so :

char *arr[3];

And then assigning each string literal :

arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

would still invoke Undefined behavior, since you are attempting to modify a string literal which is read only.

What you need is, either a 2D array of chars :

char arr[][100] = {"John", "Doe", "Programmer"};

and also change the function signature to :

void invert(char arr[][100], int n)

or you have to dynamically allocate memory and use a function like strcpy(), strdup(), memcpy() etc :

char **arr;

arr = malloc(n * sizeof(char *)); // or sizeof(*arr)

if (arr == NULL) {
    fprintf(stderr, "Malloc failed to allocate memory\n");
    exit(1);
}

arr[0] = strdup("John"); // good idea to also check if strdup returned null
arr[1] = strdup("Doe");
arr[2] = strdup("Programmer");

invert(arr, n);
for(i=0;i<3;i++)
{
    printf("%s ",arr[i]);
}

for (i = 0; i < 3; i++) {
    free(arr[i]);
}

free(arr);

Comments

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.