2015-12-04 78 views
1

有人提出了這個挑戰,我一段時間回來一個字符串,我已經通過我的腦海裏了。我嘗試了幾種不同的方法,但他們證明不正確。添加輪廓標,以就地

我想要做的是,給定一些字符串(例如。abcdefghijkl),4的倍數,我想要每四個字符放置一個描述符(例如' - ')。這似乎很容易在第一,但約束是它在的地方做(沒有分配從輸入到輸出新的內存和複製。)

我想這樣做在C.我並不指望一本烹飪書「這裏是你怎麼做」的答案,但一些概念方向會很好。

編輯:我認爲,期望是,有輸入字符串的結尾分配的未使用的字節,足以在數量上允許的視線引導設施。

+0

你怎麼能期望做到沒有爲額外的'''字符分配內存?或者在角色的末尾已經有地方了? – Matteo

+1

概念上你確實需要一些新的記憶。從理論上講,字符串被視爲允許修改char的'char *',但是我們需要插入'-',這樣就會需要一些新的內存。 –

+0

@Matteo(和Dylan),這是沒有規定,但我加了上面,我希望解決這個 –

回答

3

我認爲做這件事的最好方法就是事先計算轉變。

因此給定一些字符數組ch執行以下操作。

totalShift=strlen(ch)/4; 

然後你知道有多少個空間來增加字符數組的反向循環,就像這樣。

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

int main(){ 
    char bob[64]; 

    strncpy(bob,"helloSmith",sizeof("helloSmith")); 
    int size=strlen(bob); 
    int totalShift=size/4; 
    int tmpCount=0; 
    int i; 
    bob[size+totalShift+1]='\0'; 
    for(i=size+totalShift;i>=4;i--){ 
     bob[i]=bob[i-totalShift-1]; 
     tmpCount++; 
     if(tmpCount==4){ 
      i--; 
      bob[i]='-'; 
      totalShift--; 
      tmpCount=0; 
     } 
    } 

    printf("%s\n",bob); 
    return 0; 
} 

這種方法基本上是移動你的最後一個字符到哪裏,你知道該字符串將最終結束,因爲你可以事先計算出這一點。從那裏開始,你會轉回到字符串中,並根據需要移動正確的字符。

我可能有一些基本的邏輯錯誤有,但我認爲你可以從這裏得到的核心理念。我知道在循環內改變你的增量通常被認爲是「危險的」,然而這是這種邏輯所需要的,我認爲這個問題在其他方面需要它。

編輯: 更改的sizeof到strlen的,因爲的sizeof將返回分配的內存大小這將是非常糟糕的。此外,我將循環的結尾移至4,因爲最後一塊內存不應該移位。另外我只是貼了一些我寫的代碼。

第二編輯: 正如下面的評論指出,這種方法確實把從右到左,這可能有點奇怪。下面我會發布第二組代碼,它可以從左向右工作。你可以爲自己比較差異。

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

int main(){ 
    char bob[64]; 

    strncpy(bob,"abcdefg",sizeof("abcdefg")); 
    int size=strlen(bob); 
    int totalShift=(size/4)-1; 
    int tmpCount=0; 
    int i; 
    int initCon=(size%4); 
    int firstLoop=1; 
    bob[size+totalShift+1]='\0'; 
    for(i=size+totalShift;i>=4;i--){ 
     bob[i]=bob[i-totalShift-1]; 
     tmpCount++; 
     if(firstLoop&&tmpCount==initCon){ 
      firstLoop=0; 
      tmpCount=0; 
      i--; 
      bob[i]='-'; 
      totalShift--; 
     } 
     if(tmpCount==4){ 
      i--; 
      bob[i]='-'; 
      totalShift--; 
      tmpCount=0; 
     } 
    } 

    printf("%s\n",bob); 
    return 0; 
} 
+0

良好的代碼示例記,但還有一件小事情:從末尾算起,每4個字符添加一個連字符。這個問題沒有明確說明這一點,但是將連字符的位置作爲起點不是更自然嗎?根據您的輸入長度,第一個塊也有問題。 –

+0

...詛咒你@MOehm哈哈。嗯,如果從那裏插入超級變種,它會更「自然」,但我相信調整非常容易。對於那些有興趣的人,我會建議保持邏輯相同,但要做TotalShift計算的模數,從那裏你就知道字符串' - '中的第一位/最後位置應該有多深。然後回到使用tmpCount。基本上只是在String中添加一個初始條件。 – arduic

+0

是的,但也會跳過循環的邏輯,直到'i> = 4'。嘗試分割''abcdef「'或'」abcdefg「'。 –