Как создать строковый литерал в качестве аргумента функции через конкатенацию строк в c - PullRequest
3 голосов
/ 10 апреля 2010

Мне нужно передать строковый литерал в функцию

myfunction("arg1" DEF_CHAR "arg1");

теперь часть этого сконструированного строкового литерала должна быть функцией, возвращаемой

stmp = createString();
myfunction("arg1" stmp "arg2"); //oh that doesn't work either

есть ли способ сделать это в одну строку?

myfunction("arg1" createString() "arg2"); //what instead?

ПРИМЕЧАНИЕ: C только пожалуйста.

Моя цель - избежать инициализации нового массива символов для этого = /

Ответы [ 5 ]

4 голосов
/ 10 апреля 2010

Вы не можете создать строковый литерал во время выполнения, но вы можете создать строку, например:

char param[BIG_ENOUGH];

strcpy(param, "arg1");
strcat(param, createString());
strcat(param, "arg2");
myfunction(param);
2 голосов
/ 10 апреля 2010

C не поддерживает динамические строки, поэтому то, что вы пытаетесь сделать, невозможно. Возвращаемое значение из вашей функции createString () является переменной, а не литералом, поэтому вы не можете объединить его с другими литералами. При этом, если вам действительно важно иметь это в одной строке, вы можете создать вспомогательную функцию, чтобы облегчить это, что-то вроде следующего:

char * my_formatter( const char * format, ... )
{
...
}

myfunction(my_formatter("arg1%sarg2", createString()));

Однако при таком подходе возникают некоторые проблемы с управлением памятью и безопасностью потоков.

2 голосов
/ 10 апреля 2010
char buffer[1024] = {0};
//initialize buffer with 0 
//tweak length according to your needs

strcat(buffer, "arg1");
strcat(buffer, createString()); //string should be null ternimated
strcat(buffer, "arg2");

myfunction(buffer);
1 голос
/ 10 апреля 2010

Для этого вам нужно создать массив символов; компилятор объединяет только строковые литералы.

0 голосов
/ 10 апреля 2010

Неа. Нет способа сделать это в чистом C без выделения нового буфера для объединения строк.

...