我有一个字符串This is a text
,我想把它移到左边。
所以,当我希望它转换为2个位置时,它应该导致is is a textTh
。
出于某种原因,我无法到达那里。
void rotLeft(char *s, unsigned int n)
{
char *t = malloc(sizeof(char) * n);
int i;
int ti = 0;
for(i = 0; i < n; i+=1)
{
t[ti] = s[i];
ti +=1;
}
// + n should remove the n first chars?
strcat(s + n, t);
}
答案 0 :(得分:1)
你只需要一个临时变量,这会旋转 ONCE 。 n
是字符串的长度。
void rotLeft(char *s, int n)
{
char temp;
int i;
temp = s[0];
for(i = 0; i < n-1; i++)
{
s[i] = s[i+1];
}
s[n-1]=temp;
}
答案 1 :(得分:1)
void rotLeft(char *s, unsigned int n)
{
char *t;
int l;
l = strlen(s);
t = (char *)malloc(n);
strncpy (t,s,n);
strncpy (s,s+n,l-n);
strncpy (s+l-n,t,n);
free (t);
}
请小心,不要尝试旋转超过弦长。不会根据错误检查参数值。
答案 2 :(得分:0)
我建议构建一个新的旋转字符串,而不是就地旋转现有的字符串。
char *rotLeft(char *s, int n)
{
char * t = malloc((strlen(s) + 1) * sizeof(char))
strncpy(t, s + n, strlen(s) - n);
strncpy(t + strlen(s) - n, s, n);
s[strlen(s)] = '\0';
return t;
}
答案 3 :(得分:0)
这是在不使用临时存储的情况下就地旋转字符串的经典技巧(除了单个字符)。 (生产版本应检查旋转量是否太大。)
void reverse(char* s, size_t lo, size_t hi) {
while(lo < hi) {
char t = s[lo];
s[lo++] = s[--hi];
s[hi] = t;
}
}
void rotate_left(char* s, size_t n) {
size_t len = strlen(s);
reverse(s, 0, n);
reverse(s, n, len);
reverse(s, 0, len);
}