我想创建一个函数,它将字符串分成两组字符,逐个字符,然后在第一个字符之前合并第二个字符。例如,字符串“ KILOS ”(奇数字符)将拆分为“ KL ”“ IO ”然后“ S ”,其中最终输出看起来像“ IKOLS ”。请注意,如果偶数个字符,则交换仍然相同,但“ S ”不存在。对于每个奇数情况的含义,原始字符串中的最后一个字符保留新字符串中的最后一个位置。 encode函数要求s2指向包含从s1转换的字符串的字符串。任何帮助,提示将不胜感激!谢谢。
***//I HAVE DELETED MY CODE BECAUSE I ACTUAL STUDENTS MIGHT COPY IT, AND GET CAUGHT PLAGIARIZING> SORRY>***
答案 0 :(得分:2)
事情就是这里你编写的代码很复杂,简单地循环遍历字符串可以解决问题。
void convert (char *s1, char *s2){
size_t len = strlen(s1);
for( size_t i = 0; i < len; i+=2 ){
if(i+1 < len){
s2[i+1] = s1[i];
s2[i] = s1[i+1];
}else{
s2[i] = s1[i];
}
}
s2[len]=0;
}
如果你必须使用这样的功能: -
char s[6]="hello";
char t[6];
convert(s,t);
printf("%s\n",t);
在这里,我们认为s2
有足够的内存来保存已处理的字符串。这实际上只不过是复制逻辑。您正在考虑两个字符,然后在复制时交换它们。当您访问没有对的元素(奇数个元素)时,最后到达一个位置。然后你只需复制它并继续前进。
如果您不知道数组下载的含义 - 让我告诉您,s1[i]
与*(s1+i)
相同。
另外,在最后一行中我的代码改编时,你放了*s2 = 0
。
它应该是
*(s2+len)=0;
另一件事是你的readline代码中你不需要这两行。你可以这样做: -
int read_line(char *str, int n)
{
int words; int store=0;
while((words=getchar())!='\n')
{
if(store<n)
{
*str++=words;
store++;
}
}
*str=0;
return store;
}
和
void encode(char *s1, char *s2)
{
int len = strlen(s1);
for( int i = 0; i < len; i+=2 ){
if(i+1 < len){
*(s2+i+1) = *(s1+i);
*(s2+i) = *(s1+i+1);
}else{
*(s2+i) = *(s1+i);
}
}
*(s2+len)='\0'; //<---- note this
}