【问题标题】:how do I concatenate sub strings to make a bigger string如何连接子字符串以制作更大的字符串
【发布时间】:2015-08-21 22:36:15
【问题描述】:

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

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 将来自输入,但现在我只想在测试其他代码片段时将它们视为这些值。

【问题讨论】:

  • 试试snprintfsnprintf(buf, bufsize, "java -cp . mainpackage.SomeClass %d %d", 1234567890, 98765)`

标签: c string concatenation


【解决方案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);

【讨论】:

  • 感谢您和 +1 根据我在 OP 中定义的逻辑编写人类可读的代码。我很高兴我等待而不是过早地接受其他答案之一。
【解决方案2】:

从实际的命令行,例如 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); 

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

【讨论】:

    【解决方案3】:

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

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

    C 中,字符串以空值结尾,因此每个字符串都需要一个额外的元素来存储空值。扩大数组的大小。

    system(jv + to + pin);
    

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

    【讨论】:

    • 哇 - 我不敢相信 OP 将所有字符加起来并精确地(几乎)调整了数组的大小。为什么开发人员会这样做? char数组[256]'有什么问题??
    • @MartinJames 我会说 (mis)sized。只是我的直觉,大多数 OP 这样做不是“开发人员”,否则没有冒犯:)
    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2020-08-18
    • 2022-07-06
    相关资源
    最近更新 更多