初学者:用指针反转一个字符串

时间:2016-04-15 01:15:32

标签: c pointers

我试图反转c字符串。我知道更容易的方法,但我试图练习一些指针。这编译但返回一个空字符串,我不明白为什么。我在这里缺少什么?

#include <stdio.h>
#include <stdlib.h>
int main(){
    char *forwards, *backwards;
    forwards = "hello";
    backwards = (char*) malloc( strlen(forwards) );
    int i;
    for( i = strlen(forwards) - 1; i >=0; --i )
            backwards[ strlen(forwards) - i ] = forwards[i];
    printf("%s", *backwards );
    return 0;
    }

2 个答案:

答案 0 :(得分:2)

您有多处错误。

首先计算的指数是错误的,你应该从反向索引中减去1,例如:

for (i = strlen(forwards) - 1; i >= 0; --i )
{
  printf("%d -> %lu\n", i, strlen(forwards) - i - 1);
  backwards[ strlen(forwards) - i - 1] = forwards[i];
}

/* prints
4 -> 0
3 -> 1
2 -> 2
1 -> 3
0 -> 4

请注意,没有理由让循环倒计时,for (i = 0; i < length; ++i)完全按照相同的方式工作

第二个错误是strlen不包含NUL终结符,因此您的backwards应该被分配为malloc(strlen(forwards)+1)

第三个错误是您没有在反向字符串上设置终结符,您必须手动放置它,例如:

backwards[strlen(forwards)] = '\0';

最后一个错误是你要取消引用printf中的指针,你不应该这样做,所以它应该是

printf("%s\n", backwards);
               ^
               no * here

答案 1 :(得分:1)

你的循环将导致:

backwards[1] = forwards[4];
backwards[2] = forwards[3];
backwards[3] = forwards[2];
backwards[4] = forwards[1];
backwards[5] = forwards[0];

您需要将代码更改为:

backwards[strlen(forwards) - i - 1] = forwards[i];

在C中,字符串必须以'\0'结尾,因此请确保执行:

backwards = malloc(strlen(forwards) + 1);
// ...
backwards[strlen(forwards)] = '\0';

另外,要打印字符串:

printf("%s", backwards); // no dereferencing the pointer