2012-11-14 60 views
1

初學者在這裏。我正在C中編寫一個包裝函數,如果我傳遞的字符串中的所有單詞都小於我定義的行的大小,那麼它工作正常。例如:如果我想在20個字符後換行並傳遞21個字符的單詞,它不會換行。將連字符插入換行功能

我實際上想要做的是在行尾添加一個連字符,如果我傳遞一個長字(比定義的行大小更長)並在下一行繼續。 我已經研究並發現了很多帶有包裝功能的網站,但是他們都沒有展示如何插入連字符,所以你們能幫助我嗎?你能告訴我一個插入連字符的例子,或者請指點我正確的方向嗎? 在此先感謝!

我的包裝功能部件:

int wordwrap(char **string, int linesize) 
{ 
    char *head = *string; 
    char *buffer = malloc(strlen(head) + 1); 
    int offset = linesize; 
    int lastspace = 0; 
    int pos = 0; 

    while(head[pos] != '\0') 
    { 
     if(head[pos] == ' ') 
     { 
      lastspace = pos; 
     } 
     buffer[pos] = head[pos]; 
     pos++; 

     if(pos == linesize) 
     { 
      if(lastspace != 0) 
      { 
       buffer[lastspace] = '\n'; 
       linesize = lastspace + offset; 
       lastspace = 0; 
      } 
      else 
      { 
       //insert hyphen here? 
      } 
     } 
    } 
    *string = buffer; 
    return; 
} 

我的主要功能:

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char *text = strdup("Hello there, this is a really long string and I do not like it. So please wrap it at 20 characters and do not forget to insert hyphen when appropriate."); 

    wordwrap(&text, 20); 

    printf("\nThis is my modified string:\n'%s'\n", text); 
    return 0; 
} 
+0

感謝您的輸入。我知道你不能在這一行結尾打破這個詞。我研究瞭如何打破一個長詞,然而'連字符'和'返回'字符正在替代那個長詞的兩個字符。我知道使用realloc可以工作,但如果我輸入一個非常長的字符串,效率不會很高。那麼還有其他方式可以想到嗎?謝謝。 –

回答

0

你可能需要的malloc內存塊,並從您的字符串複製到新的領域。當你到達想要添加中斷的地方時,只需插入一個換行符。請記住,有些內容需要釋放新的內存塊,否則會導致內存泄漏並最終耗盡內存。

+0

得到的字符串長度的一個很好的初始估計是'strlen(string)* 21/20 + 1',即它假定您將在每20個字符後添加一個連字符。 –

+0

嗨,螞蟻,我完全理解你在說什麼,但我不能把它翻譯成代碼。你能告訴我一個例子嗎?謝謝。 –

+0

我可以首先檢查你是否使用C而不是C++,因爲那樣它就會變得很容易! – Ant

0

對於realloc問題,一個好的解決方案是間隙緩衝區

您最初在數據前分配了4Kb間隔。

[____________string start here... ] 
[str____________ing start here... ] 
[string\n___________start here... ] <-- here I just decided to insert line break 

當您刪除空格或字符時,差距會變大。當你添加連字符和換行符時,差距就會縮小。無論如何,你只需要關注每一個角色從差距的末端到差距的開始。

可能的第一遍是將間隙插入緩衝區的末尾,並向後工作以刪除多餘的空格或換行符或計算字長。

當然可以在任何時候展望並計算下一個單詞是否過長。