我認爲做這件事的最好方法就是事先計算轉變。
因此給定一些字符數組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;
}
你怎麼能期望做到沒有爲額外的'''字符分配內存?或者在角色的末尾已經有地方了? – Matteo
概念上你確實需要一些新的記憶。從理論上講,字符串被視爲允許修改char的'char *',但是我們需要插入'-',這樣就會需要一些新的內存。 –
@Matteo(和Dylan),這是沒有規定,但我加了上面,我希望解決這個 –