C 弦的快移字符
我有一个字符串C 弦的快移字符,c,string,C,String,我有一个字符串这是一个文本,我想把它移到左边。 所以,当我想让它移动两个位置时,它应该会导致是一个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 +
这是一个文本,我想把它移到左边。
所以,当我想让它移动两个位置时,它应该会导致是一个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);
}
void rotleet(字符*s,无符号整数n)
{
char*t=malloc(sizeof(char)*n);
int i;
int ti=0;
对于(i=0;i
您只需要一个临时变量,它将旋转一次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;
}
void rotlef(字符*s,整数n)
{
焦炭温度;
int i;
温度=s[0];
对于(i=0;i
只要小心,不要试图旋转超过绳子的长度。参数值未针对错误进行检查。我建议构造一个新的旋转字符串,而不是原地旋转现有字符串
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;
}
下面是在不使用临时存储(除了单个字符)的情况下原地旋转字符串的经典技巧。(生产版本应检查旋转量是否过大。)
void reverse(字符数、大小低、大小高){
while(lo
AKA,您想交换字符的位置是字符串的长度还是移位量?如果是第一个,那么我假设函数向左旋转1个字符。请注意,ti
和i
始终具有相同的值:都初始化为0,都递增1。这不是你想要的。您希望ti
比i
后退一步,因此s的位置1处的字符被复制到t的位置0处的字符,位置2处的字符被复制到位置1处,依此类推。@Farseer否,s
是一个指针,所以s+n
=s+n*sizeof(*s)
字节。@IMX您理解错了。将字符串的长度作为参数n传递,然后它将旋转一次。根据需要调用这个函数,但我不需要它旋转一次。我只需要它旋转n(比如说2)个字符。然后调用这个函数两次!不抱歉,我实际上+1这个,但不知怎么的,有另一个答案有内存泄漏,但它消失了,所以我一定是不小心把它贴在这里:P对不起,你能证明一下,为什么他不应该在原地旋转吗?我喜欢我的字符串不可变,只是我个人的喜好。而且你似乎也喜欢内存泄漏,通过分配您没有释放的内存,并且在函数中执行分配,调用您函数的人在读取源代码之前不会知道这一点。如果您不喜欢更改s
,只需添加另一个参数作为目标字符串。哦,我喜欢内存泄漏!说真的,我假设我已经掌握了C如何处理记忆的实用知识,我是否总是需要在你之后详细说明如何清理?在编写库时,通常的做法是将这样的信息放在文档字符串中,这样就不必读取源代码。我这里没有,处理它。t=malloc(n+1);不需要强制转换,但需要分配足够的空间。
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;
}
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);
}