2016-11-16 3 views
2

Я пытаюсь создать процессы для своего проекта. Я буду аргументами pas для дочернего процесса от родителя, и аргумент изменится со временем, поэтому я хотел попробовать сначала передать 1 ребенку. Формат строки должен быть таким, как «childname.exe c», где c представляет случайный символ (в данном случае это 1 для просто пробной версии).Получение первой строки из строкового массива в c

Я создал массив дочерних имен, и все, что мне нужно, это объединить новую строку с дочерней строкой и скопировать ее в другой массив строк (переменная lpCommandLine). Когда я отлаживал код ниже, я увидел, что child_name [0] (когда i равно 0) возвращает только «C», хотя я ожидал, что он вернет «ChildProj1.exe». Есть ли точка, которую я пропустил или как это сделать в 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

где вы думаете, новая строка « 1» будет сохранена. strcat_s не удалось, потому что вы пытались добавить символы в буфер - проверьте возвращаемое значение srcat_s – pm100

+0

@ Y.E.S. Неясно, что вы собираетесь получить в массиве lpCommandLine. Покажите его содержимое. –

+0

Я хочу, чтобы он хранился в lpCommandLine.В массиве child_names 0-я строка - «ChildProj1.exe», и я хочу, чтобы lpCommandLine [0] был «ChildProj1.exe 1». Итак, вы предлагаете выделить память для каждого индекса child_names для 16 символов, что означает ChildProj1.exe + 3 (для пустого и 1 и \ 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_s и strcpy_s. Гораздо лучше использовать стандартную функцию strcat и strcpy.

Что вы такое, что показано в этой демонстративной программе.

#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 
0

Вместо char * child_names[] вы имели в виду что-то вроде char[][] child_names, char[] * child_names или char ** child_names?

+0

Я хочу хранить строки в этом массиве, уже пробовал char [] [], char **, но не работал. –

+0

с char * child_names [], я попытался напечатать каждый элемент и правильно напечатать этот код 'printf ("% s ", child_names [i]);'. Он печатает каждую строку, как это, но когда я хочу, чтобы сделать конкатенирование, все сходит с ума. –

0

сделать строка CONCAT сделать

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

Я только что попробовал это сейчас, и в баффе есть только «\ 0». Если у вас есть время, вы можете попробовать его с вашим компилятором, я задаюсь вопросом, есть ли проблема с моим компилятором сейчас. –