我试图反转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;
}
答案 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