如果我有字符串.....ZZ..ZZ.....
或.Z.1.Z.23Z.4.Z55
,
是否有一种简单的方法可以将Z
字符串中的所有字符移动到当前位置右侧的一个空格中?
一些额外的测试字符串是:
.Z
Z.
ZZ.
.ZZ
Z
ZZ
ZZZ
我认为这个问题的一些较高的投票答案(包括目前接受的答案)不适用于这些测试.
只需遍历文本并交换字符:
int main () { char text[] = "...Z.Z.Z...", temp; int text_len = strlen (text), i; for (i = text_len - 1; i >= 0; i--) { if (text[i] == 'Z') { temp = text[i+1]; text[i+1] = text[i]; text[i] = temp; } } printf ("%s\n", text); return 0; }
生产:
[~]$ gcc zshift.c && ./a.out ....Z.Z.Z..
关于上述代码中可能出现的1个错误的评论中有很多讨论.但是,简单的测试/单步测试足以表明情况并非如此.
zshift "Z." -> ".Z" zshift ".Z" -> "." zshift "Z" -> ""
我认为当从弦的末端移开时"掉落"尾随Z的行为是明智的.毕竟,如果移位整数的位,则会丢弃最终超出整数范围的位.
如果需要另一种行为 - 例如,仅在字符串内移位 - 对算法的更改最小:
temp = text[i+1]; if (temp == 0) continue; text[i+1] = text[i]; text[i] = temp;