Y.E.S. Y.E.S. - 16 days ago 7
C Question

Getting first string from string array in c

I am trying to create processes for my project. I will pas arguments to child process from parent and the argument will change in time, so i wanted to make a try first with passing 1 to the child. The string format should be like this "childname.exe c" where c represents random character (in this case it is 1 for just trial).

I created a childname array and and all i wanted was concatenate the new string with childname string and copy it to another string array(lpCommandLine variable). When i debugged the code below i saw that child_name[0] (when i is equal to 0) returns only 'C' although i expected it to return "ChildProj1.exe". Is there a point that i missed or how to do it in c?

here there is a image of what i getin debugger: here stored values of in variables

#define NO_OF_PROCESS 3

char *child_names[]= {"ChildProj1.exe", "ChildProj2.exe", "ChildProj3.exe" };
char* lpCommandLine[NO_OF_PROCESS];
int i;

for (i = 0; i < NO_OF_PROCESS; i++)
lpCommandLine[i] = (char *)malloc(sizeof(char) * 16);


for (i = 0; i < NO_OF_PROCESS; i++)
{
strcat_s(child_names[i], strlen(child_names[i]), " 1");
strcpy_s(lpCommandLine[i], strlen(lpCommandLine[i]), child_names[i]);
}

Answer

From your description it follows that you want to get strings like this

"childname.exe c"

However this loop

for (i = 0; i < NO_OF_PROCESS; i++)
{
    strcat_s(child_names[i], strlen(child_names[i]), " 1");
    strcpy_s(lpCommandLine[i], strlen(lpCommandLine[i]), child_names[i]);
}

does not do what you want.

This loop has undefined behavior because in this statement

    strcat_s(child_names[i], strlen(child_names[i]), " 1");

there is an attempt to modify a string literal. You may not change string literals neither in C nor in C++.

Moreover in this statement

    strcpy_s(lpCommandLine[i], strlen(lpCommandLine[i]), child_names[i]);

this call

strlen(lpCommandLine[i])

also has undefined behavior because array pointed to by this pointer lpCommandLine[i] does not has the terminating zero.

There is no any need to use the functions strcat_s and strcpy_s. It is much better to use standard function strcat and strcpy.

What you is the following that is shown in this demonstrative program.

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

#define NO_OF_PROCESS   3

int main(void) 
{
    const char * child_names[]= 
    {
        "ChildProj1.exe", 
        "ChildProj2.exe", 
        "ChildProj3.exe" 
    };

    const char *s = " 1";
    size_t n = strlen( s );

    char* lpCommandLine[NO_OF_PROCESS];

    for ( int i = 0; i < NO_OF_PROCESS; i++ )
    {
        lpCommandLine[i] = ( char * )malloc( strlen( child_names[i] ) + n + 1 );
    }

    for ( int i = 0; i < NO_OF_PROCESS; i++ )
    {
        strcpy( lpCommandLine[i], child_names[i] );
        strcat( lpCommandLine[i],  s );
    }

    for ( int i = 0; i < NO_OF_PROCESS; i++ ) puts( lpCommandLine[i] );

for ( int i = 0; i < NO_OF_PROCESS; i++ ) free( lpCommandLine[i] );

    return 0;
}

The program output is

ChildProj1.exe 1
ChildProj2.exe 1
ChildProj3.exe 1