2015-08-21 22 views
2

具體來說,我試圖建立了以下語句和運行它下面的命令:我怎麼串連子串作出更大的字符串

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將來自輸入,但現在我只想將它們當作這些值來處理,而我測試其他代碼段。

+2

嘗試'snprintf'snprintf(BUF,BUFSIZE, 「java命令。mainpackage.SomeClass%d%d」,1234567890,98765)' – fukanchik

回答

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

感謝您和+1編寫符合我在OP中定義的邏輯的人類可讀代碼。我很高興我等了,而不是過早接受其他答案之一。 – CodeMed

1

從實際的命令行,如int主(INT ARGC,字符** 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); 
0

第一,讓我告訴你上述代碼中的錯誤。

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

,字符串是空終止,所以你會需要每串來存儲空一個額外的元素。展開數組的大小。

的,用於級聯像

system(jv + to + pin); 

你可以定義數組足夠大的舉行級聯終值和使用strcat()來連接的源和目標字符串。您可以使用循環來追加多個子字符串以創建完整的命令字符串。

+0

哇 - 我無法相信OP將所有字符加起來並精確地確定陣列的大小(幾乎)。爲什麼開發者會這樣做? char數組[256]有什麼問題? –

+0

@MartinJames我會說(_mis_)大小。就我的直覺而言,OP的大部分工作並不是「開發者」,否則就不會成爲犯罪:) –