C 作为参数传递给函数时连接字符串

C 作为参数传递给函数时连接字符串,c,string,C,String,有一个函数将字符串作为参数/参数 Func(char* strA) { ... } 我有两条弦 #define FIRST "first" char efg[] = " second"; 我基本上想将“first second”作为参数发送到Func(strA),但我不想使用strcat(first,efg)因为它将永久性地更改我的宏第一个 有没有一种方法可以将“first second”作为参数发送而不打乱上面的宏?也许您可以先使用strcpy()将宏复制到一个新的字符数组中,然后使用st

有一个函数将字符串作为参数/参数

Func(char* strA)
{
...
}
我有两条弦

#define FIRST "first"
char efg[] = " second";
我基本上想将
“first second”
作为参数发送到
Func(strA)
,但我不想使用
strcat(first,efg)因为它将永久性地更改我的宏
第一个


有没有一种方法可以将
“first second”
作为参数发送而不打乱上面的宏?

也许您可以先使用
strcpy()将宏复制到一个新的字符数组中,然后使用
strcat(new_var,efg)
-将其作为参数传递。

也许您可以首先使用
strcpy()将宏复制到一个新的字符数组中
,然后
strcat(新变量,efg)
-将其作为参数传递。

您可以使用sprintf函数在临时缓冲区中首先写入:

#define FIRST "first"
char efg[] = " second";  
char* space = " ";
char* strA = calloc(strlen(FIRST) + strlen(space) + strlen(efg) + 1, sizeof(char));  

sprintf(strA,"%s%s%s",FIRST, space, efg);

Func(strA);  

free(strA);  
试试看


注意:不要忘记free()动态分配内存

说明:

sprintf()
函数类似于
printf()
,只是输出被发送到缓冲区。返回值是写入的字符数

您可以使用sprintf函数在临时缓冲区中首先写入:

#define FIRST "first"
char efg[] = " second";  
char* space = " ";
char* strA = calloc(strlen(FIRST) + strlen(space) + strlen(efg) + 1, sizeof(char));  

sprintf(strA,"%s%s%s",FIRST, space, efg);

Func(strA);  

free(strA);  
试试看


注意:不要忘记free()动态分配内存

说明:

sprintf()
函数类似于
printf()
,只是输出被发送到缓冲区。返回值是写入的字符数

如果允许您不将
efg
作为变量,而是作为字符串文字,那么由于相邻字符串文字是隐式连接的(规范C99:5.1.1.2.6),您可以简单地拥有以下内容:

Func(FIRST " second");
出于同样的原因,您也可以将
efg
声明为

char efg[] = FIRST " second";

无论哪种方式,都比strcat或sprintf容易得多。

如果允许您不将
efg
作为变量,而是作为字符串文字,那么由于相邻字符串文字是隐式连接的(规范C99:5.1.1.2.6),您可以简单地拥有以下内容:

Func(FIRST " second");
出于同样的原因,您也可以将
efg
声明为

char efg[] = FIRST " second";

无论哪种方式,都比strcat或sprintf容易得多。

charefg[]={“second”}不正确。它应该是
char efg[]=“秒”@Pubby有什么建议吗?@Pubby:为什么?两者都是完全有效的C.@R。。哦,我没意识到。那就别管了。@Sunny你可以查看我更新的答案。
char efg[]={“second”}不正确。它应该是
char efg[]=“秒”@Pubby有什么建议吗?@Pubby:为什么?两者都是完全有效的C.@R。。哦,我没意识到。那就别管了。@Sunny你可以检查我更新的答案。@R。。我确信你会是第一个指出这一点的人。它是安全的(除了没有检查
calloc
的返回值是否成功,以及
calloc
的参数数目错误),因为所需的空间是正确计算的,但无论如何,使用
snprintf
还是不错的。OP也应该知道缓冲区在某个时候需要释放。另一个小改进:不要强制转换
calloc()
@H2CO3 Done.的返回值。。谢谢阿帕德@R我确信你会是第一个指出这一点的人。它是安全的(除了没有检查
calloc
的返回值是否成功,以及
calloc
的参数数目错误),因为所需的空间是正确计算的,但无论如何,使用
snprintf
还是不错的。OP也应该知道缓冲区在某个时候需要释放。另一个小改进:不要强制转换
calloc()
@H2CO3 Done.的返回值。。谢谢阿帕德!