有人曾经向我提出过这个挑战,我一直在想着这个问题。我尝试了几种不同的方法,但事实证明它们不正确。
我想要做的是,给定一些字符串(例如abcdefghijkl),大小为4,我想每四个字符放置一个描绘符(例如,' - ')。这看起来很容易,但是约束是必须在适当的位置完成(不分配新内存并从输入复制到输出。)
我想在C中这样做。我不一定期望一本烹饪书“这里是你怎么做的”答案,但是一些概念方向会很好。
编辑:我认为期望是,在输入字符串的末尾分配了未使用的字节,数量足以允许描绘符。
答案 0 :(得分: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;
}
此方法基本上将您的最后一个字符移动到您知道字符串最终结束的位置,因为您可以事先计算出来。从那里你将转回到字符串中并根据需要将字符移动正确的数量。
我可能会遇到一些基本的逻辑错误,但我认为你可以从这里获得核心概念。我知道它通常被认为是&#34;危险&#34;改变你在循环中的增量,但是这种逻辑需要它,我认为这个问题本身就要求它。
编辑: 将sizeof更改为strlen,因为sizeof将返回已分配内存的大小,这将非常糟糕。此外,我将循环的结尾移动到4,因为最后一块memmory不应该移位。我还粘贴了一些我写的代码。
第二次编辑: 正如下面的评论所指出的,这种方法确实从右到左放置了 - 这可能有点奇怪。下面我将发布从左到右工作的第二组代码。您可以自己比较差异。
#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;
}