从c中获取字符串数组的第一个字符串

时间:2016-11-16 23:23:29

标签: c arrays string string-concatenation

我正在尝试为我的项目创建流程。我将从父级传递子进程的参数,并且参数将及时更改,所以我想先尝试将1传递给子进程。字符串格式应该是这样的" childname.exe c"其中c代表随机字符(在这种情况下,它仅为1试用)。

我创建了一个childname数组,并且我想要的是将新字符串与childname字符串连接起来并将其复制到另一个字符串数组(lpCommandLine变量)。当我调试下面的代码时,我看到child_name [0](当我等于0时)只返回' C'虽然我期望它返回" ChildProj1.exe"。有没有一点我错过了或如何在c?

这里有一个我在调试器中得到的图像: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]);
    }

3 个答案:

答案 0 :(得分:1)

根据您的描述,您希望获得这样的字符串

"childname.exe c"

然而这个循环

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]);
}

没有做你想做的事。

此循环具有未定义的行为,因为在此声明中

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

尝试修改字符串文字。您不能在C和C ++中更改字符串文字。

此外在本声明中

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

此次电话

strlen(lpCommandLine[i])

也有未定义的行为,因为此指针lpCommandLine[i]指向的数组没有终止零。

无需使用strcat_sstrcpy_s功能。使用标准函数strcatstrcpy

会好得多

本演示程序中显示了以下内容。

#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;
}

程序输出

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

答案 1 :(得分:0)

而不是char * child_names[]你的意思是char[][] child_nameschar[] * child_nameschar ** child_names

答案 2 :(得分:0)

做字符串concat do

size_t sz = strlen(child_names[i]) + 3; // space, '1' and \0
char *buff = malloc(sz); 
strcat_s(buff,sz,child_names[i]);
strcat_s(buff,sz," 1");