为什么我的反向功能在C中不起作用?

时间:2014-11-17 16:25:41

标签: c string loops while-loop reverse

void str_reverse(char *l, char *r){
    char *start = l; //gives while loop place to stop, the start of the string
    while (*l != '\0'){
        *l++;
    } //loops the to the end terminator

    *l--; //last character

    while (*l != *start){
        *r = *l;
        *l--;
        *r++;
    } // adds the string from back to front to new string

    *r = '\0'; 
}

有人告诉我,当我打印出* r时,为什么我错过了第一个角色?例如,你好反转是olle?感谢

4 个答案:

答案 0 :(得分:1)

错误是使用解除引用递增指针,如* l ++,并将指针与它们指向的值进行比较。固定代码如下:

void str_reverse(char *l, char *r){

char *start = l; //gives while loop place to stop, the start of the string
while (*l != '\0'){
    l++;
    } //loops the to the end terminator

l--; //last character

while (l >= start){
    *r = *l;
    l--;
    r++;
} // adds the string from back to front to new string

*r = '\0'; 

}

答案 1 :(得分:0)

更改为do-while:

do {
   *r = *l;
   l--;
   r++;
   // adds the string from back to front to new string
} while (l != start);

*r = '\0';

答案 2 :(得分:0)

几乎没有检查错误。 第一        while(*l != *start) 循环将退出而不复制最后一个字符。

因此检查应基于地址。

while(l >= start)

只需要递增和递减指针*l--并且*r++不是你打算做的。

#include <stdio.h>
#include <string.h>

void str_reverse(char *l, char *r){

char *start = l; //gives while loop place to stop, the start of the string
while (*l != '\0'){
    *l++;
    } //loops the to the end terminator

*l--; //last character

while (l >= start){
    *r = *l;
    l--;
    r++;
} // adds the string from back to front to new string

*r = '\0'; 


}
int main()
{
   char a[20] = "somestring";
   char b[20];
   str_reverse(a,b);
   printf("%s",b);
   return 0;
}

答案 3 :(得分:-1)

void str_reverse(char *l, char *r) {

    char *start = l; //gives while loop place to stop, the start of the string

    while (*l != '\0'){
        l++;
    } //loops the to the end terminator

    l--; //skips \0

    while (l >= start){
        *r = *l;
        l--;
        r++;
    } // adds the string from back to front to new string

    *r = '\0'; 
}

注意while条件已经改变,指针算术也是正确的。