2016-11-16 20 views
2

私のプロジェクトのプロセスを作成しようとしています。私は親から子プロセスへの引数を渡しますが、その引数は時間の経過とともに変更されるので、最初に子に1を渡して試してみたかったのです。文字列形式は、この "childname.exe c"のようにする必要があります.cはランダムな文字を表します(この場合は試行の場合は1です)。cの文字列配列から最初の文字列を取得

私はchildname配列を作成しました。私が望むのは、新しい文字列をchildname文字列に連結し、別の文字列配列(lpCommandLine変数)にコピーするだけでした。下のコードをデバッグしたとき、child_name [0](0に等しいとき)は「ChildProj1.exe」を返すと予想していましたが、「C」のみを返します。私が逃した点や、それをCで行う方法はありますか?

は、ここで私は、デバッガをgetinもののイメージがあります: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]); 
    } 
+0

です。バッファに文字を追加しようとしたためにstrcat_sが失敗しました - srcat_sの戻り値を確認してください – pm100

+0

@ Y.E.S。配列lpCommandLineに何を取得しようとしているのかは不明です。その結果の内容を表示します。 –

+0

lpCommandLineに格納します。child_names配列0番目の文字列は "ChildProj1.exe"で、lpCommandLine [0]は "ChildProj1.exe 1"になります。だからあなたはChildProj1.exe + 3(空白と1と\ 0)を意味する16文字の各child_namesインデックスのためにメモリを割り当てることを提案します –

答えて

1

を行いますあなたが欲しいもの。

リテラル文字列を変更しようとする試みがある。この文で

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

ので、このループは未定義の動作をしています。文字列リテラルをCでもC++でも変更することはできません。

この文でさらに

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

アレイが終了ゼロを有しないlpCommandLine[i]このポインタによって指されるため、このコール

strlen(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; 
} 

プログラムの出力は、新しい文字列「 1」が格納されようとしていると思います

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

代わりのchar * child_names[]あなたがchar[][] child_nameschar[] * child_names、またはchar ** child_namesような何かを意味しましたか?しかし、このループ

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

は行いませんが、この

"childname.exe c" 

のような文字列を取得したいことを以下の文字列の連結を行うための

+0

私はその配列に文字列を保存したい、既にchar [] []、char **を試しましたが、うまくいきませんでした。 –

+0

char * child_names []、私は各要素を印刷しようとしましたが、このコードprintf( "%s"、child_names [i]); 'で正しく印刷されました。このように各文字列を表示しますが、連結したい場合は狂気になります。 –

0

はあなたの説明から

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"); 
+0

childname [0] = 'C'は赤ちゃんです。あなたは単にデバッガの文字ではなく文字列として表示する必要があります – pm100

+0

私は今それを試してみましたが、buffには "\ 0"としか書かれていません。あなたのコンパイラで試してみる時間があれば、私のコンパイラに今問題があるのだろうかと思います。 –

関連する問題