如何连接子字符串以生成更大的字符串

时间:2015-08-21 22:36:16

标签: c string concatenation

具体来说,我正在尝试构建以下语句并将其作为以下命令运行:

system("java -cp . mainpackage.SomeClass 1234567890 98765");

我已经在线研究了这个,但是这些例子没有编译,所以我拼凑了下面的说明性伪代码。 如何更改下面的代码以使其连接字符串并执行命令?

#include <stdio.h>

main() {
    char jv[33];
    strcpy(jv, "java -cp . mainpackage.SomeClass ");
    char to[10];
    strcpy(to, "1234567890 ");
    char pin[5];
    strcpy(pin, "98765");
    system(jv + to + pin);
}  

topin是发送到java程序的参数。最终,topin将来自输入,但是现在我只想在测试代码的其他部分时将它们视为这些值。

3 个答案:

答案 0 :(得分:1)

从实际的命令行,如int main(int argc,char ** argv)

char buf[1024] = {0};
int n;
for (n = 0; n < argc; n ++)
  strcat (buf, argv[n]); // Change to strlcat if you have it available (BSD or Mac)
printf ("result = %s\n", buf);

或使用您的示例:

char jv[33];
strcpy(jv, "java -cp . mainpackage.SomeClass ");
char to[10];
strcpy(to, "1234567890 ");
char pin[5];
strcpy(pin, "98765");
system(jv + to + pin);


char result[1024] = {0}; // C does not zero format variables inside a function, so we do it ourselves with = {0}
sprintf (result, "%s %s %s", jv, to, pin); // Should use snprintf instead if available
printf ("result = %s\n", result); 

OR

char result[1024] =  {0};
strcat (result, jv);
strcat (result, " ");
strcat (result, to);
strcat (result, " ");
strcat (result, pin); // Should use strlcat instead if available
printf ("result = %s\n", result); 

答案 1 :(得分:1)

snprintf()是一种灵活且安全的方法。 @fukanchik。 C的主要挑战是:
1)管理字符串存储空间和
2)防止超支。

const char *jv = "java -cp . mainpackage.SomeClass ";
const char *to = "1234567890 ";
const char *pin = "98765";

#define BIGBUF 100
char command[BIGBUF];
snprintf(command, sizeof command, "%s%s%s", jv, to, pin);
system(command);

或者使用C99并假设整数

const char *jv = "java -cp . mainpackage.SomeClass";
long to = 1234567890;
long pin = 98765;
int n = snprintf(NULL, 0, "%s %ld %ld", jv, to, pin);
char command[n+1];
snprintf(command, sizeof command, "%s %ld %ld", jv, to, pin);
system(command);

答案 2 :(得分:0)

首先,让我告诉你上面代码中的错误。

char jv[33];
strcpy(jv, "java -cp . mainpackage.SomeClass ");
C中的

,字符串以空值终止,因此每个字符串需要一个额外的元素来存储空值。扩展数组的大小。

用于连接,如

system(jv + to + pin);

你可以定义一个数组足够大来保存连接的最终值,并使用strcat()来连接源和目标字符串。您可以根据需要使用循环来附加多个子字符串以生成完整的命令字符串。