2011-03-05 96 views
1

我正在處理一個輸入字符串,它包含一個進程名稱,後跟任意數量的參數。連接多個字符串?

我需要一個字符串中的進程名稱以及所有參數。 我以爲我可以在一個循環中使用strcat,以便循環遍歷所有的參數,並且每次都將arg附加到字符串,但是我在獲取空的字符串以開始循環時遇到問題。

任何人都可以幫助我一些基本的代碼?

謝謝。

編輯: 我發佈我的代碼爲清晰。小李的職位是最接近我現在有:

char * temp; 
    strcpy(temp,""); 
    for (i = 4; i < argc-1; i++) // last arg is null, so we need argc-1 
    { 
     strcat(temp,argv[i]); 
     strcat(temp," "); 
    } 

在我的for循環的時刻(神奇的數字,我知道) 我得到這個代碼段錯誤忽略4。是因爲我的字符串分配?我認爲是這樣,因此我問了如何組合字符串的問題。

+1

我想你將需要分配一個緩衝區的地方。首先進入隨機緩衝區的strcpy需要很多運氣才能工作! – 2011-03-05 19:42:55

+0

如果你可以把它形成一個答案,我會給你複選標記。因爲這就是我所需要的,是一個溫度第一的malloc。謝謝! – Blackbinary 2011-03-05 19:48:54

+0

我已經更新了我的答案。我沒有包含很多代碼,因爲我認爲你基本上知道你在做什麼,不需要爲你寫的代碼! – 2011-03-05 19:54:26

回答

1

你想要一個空的C字符串?這是你在找什麼:char p[] = "";


UPDATE

後您發佈一些代碼,很顯然,你已經忘記了分配緩衝temp。只需首先運行參數,計算所需的長度(使用strlen),然後分配temp。不要忘記零終結者的空間!

0

你可以提供「的參數的任意量」作爲一個參數,即一個陣列/列表中,然後執行該僞代碼:

str = ""; 
i = 0; 
while i < length of input 
{ 
str = strcat (str , input[i]); 
i++; 
} 
0

在C A字符串由字符數組被終止表示通過一個「空」字符,其值爲0的'\ 0'。這讓所有字符串函數知道字符串的末尾在哪裏。下面是對聲明一個空字符串的不同方式的探索,以及它們的含義。

得到一個空字符串的常用方法是

char* emptyString = ""; 

不過,現在emptyString指向字符串文字,無法進行修改。如果你想在你的循環中連接一個空字符串,你必須在初始化時將它聲明爲一個數組。

char buffer[] = ""; 

這給你一個大小的數組。即buffer[0]是0.但是你想要一個數組連接到它必須足夠大以適應字符串。所以,如果你有一定大小的字符串緩衝區,可以初始化它是空的,像這樣:

char buffer[256] = ""; 

串在buffer現在是「空字符串」。它包含的內容是buffer[0]是0,緩衝區的其餘條目可能是垃圾,但是一旦連接了其他字符串,這些內容就會被填充。

不幸的是,C的問題是,你永遠不會有一個「無限」的字符串,在那裏你可以安全地連接在一起,你從知道它從一開始就是確定的大小。如果你的參數數組也是字符串,你可以使用strlen找到它們的長度。這給你一個字符串的長度,沒有空字符。一旦你知道了所有子字符串的長度,你現在就會知道你的最終緩衝區會有多長。

int totalSize; // assume this holds the size of your final concatenated string 
// Allocate enough memory for the string. the +1 is for the null terminator 
char* buffer = malloc(sizeof(char) * (totalSize + 1)); 
buffer[0] = 0; // The string is now seen as empty. 

在此之後,您可以使用strcat自由連接字符串。

+2

這是一個非常不規範的方式來獲得一個空的C字符串。 – 2011-03-05 19:37:00

+0

@David Heffernan我想我已經超越了我自己。我添加了一些澄清。 – 2011-03-05 20:15:21

0
#include<stdio.h> 
    #include<stdarg.h> 

    int main(int argc, char** argv) { 
      // the main parameters are the same situation you described 
      // calling this program with main.exe asdf 123 fdsa, the program prints out: asdf123fdsa 

      int lengths[argc]; 
      int sum =0; 
      int i; 
      for(i=1; i<argc; i++) { // starting with 1 because first arg is program-path 
        int len = strlen(argv[i]); 
        lengths[i] = len; 
        sum+=len; 
      } 
      char* all = malloc(sum+1); 
      char* writer = all; 
      for(i=1; i<argc; i++) { 
        memcpy(writer, argv[i], lengths[i]); 
        writer+=lengths[i]; 
      } 
      *writer = '\0'; 
      printf("%s\n", all); 

      system("pause"); 
      return 0; 
    } 
+0

我覺得'int長度[argc];'不是標準的C,是嗎? – Thomas 2011-03-05 19:41:52

+0

@Thomas是的,它只在C99中添加。 'malloc(sizeof(int)* argc)'將與舊的編譯器兼容。 – 2011-03-05 19:48:17

+0

這將完成工作。難道它不僅僅是讓你用真正的內置動態長度字符串對象來愛語言! – 2011-03-05 20:18:18

5

比方說,你輸入的字符串是在char指針,暗示性地叫argv一個數組,長度argc的。

我們首先需要確定多少空間所需的輸出:

int length = 0; 
for (int i = 0; i < argc; ++i) 
    length += strlen(argv[i]); 

然後我們將它分配,對於'\0'終止添加額外的char

char *output = (char*)malloc(length + 1); 

最後,級聯:

char *dest = output; 
for (int i = 0; i < argc; ++i) { 
    char *src = argv[i]; 
    while (*src) 
     *dest++ = *src++; 
} 
*dest = '\0'; 

請注意,我沒有在這裏使用strcat。原因是,這使我們爲Schlemiel the Painter's algorithm:對於每次迭代,整個輸出字符串將被掃描以查找其結束,導致二次運行時間。

不要忘記釋放輸出字符串時,即可大功告成:

free(output); 

我有點累了,所以我在這裏可以俯瞰東西。歡迎使用標準庫函數的更好解決方案。如果strcat返回一個指向dest中的終止字節的指針,但這很方便。

+0

您也可以使用一系列的(n)printf調用,因爲它們返回了寫入的字符數。 – user470379 2011-03-05 20:21:17

+0

這應該比重量級的'printf'變種更簡單。但你是對的,它確實有效。 – Thomas 2011-03-06 09:54:07