我想知道这里发生了什么,我在反向函数之外为dest变量分配空间。然后在函数调用中写入它。但我的输出是空白的。我想在没有malloc的情况下这样做,纯粹出于教育目的。感谢
#include <stdio.h>
#include <string.h>
/*function declaration*/
void reverse(char *src, char *dest);
int main(void) {
char src[] = "hello, world";
char dest[strlen(src)];
reverse(src, dest);
printf("%s\n", dest);
return 0;
}
/*function reverse a string*/
void reverse(char *src, char *dest) {
int i;
int j = 0;
for(i = strlen(src); i >= 0; i--) {
*(dest+j) = *(src+i);
++j;
}
}
答案 0 :(得分:1)
1)因为你的迭代以
开头for(i = strlen(src); i >= 0; i--) {
它将0
分配给dest,从而终止字符串。所以printf()在看到0
终结符时没有打印任何内容。您可以将其重写为:
for(i = strlen(src) - 1; i >= 0; i--) {
*(dest+j) = *(src+i);
++j;
}
dest[j] = 0; /* terminates the string */
2)你有另一个问题。您的dest
空间不足。它应该是:
char dest[strlen(src) + 1]; /* Notice the +1 */
3)您应该将size_t
用于数组索引而不是int
。
答案 1 :(得分:1)
您忘记了字符串中的空字符。 dest
不足以保持字符串的反向,因为需要一个空终止符:
char dest[ strlen(src) + 1 ];
然后在循环中,您将空终止符复制到字符串的前面,因此它本质上是字符串""
但使用更多内存。您需要从索引strlen() - 1
开始:
for(i = strlen(src)-1; i >= 0; i-- ){
答案 2 :(得分:0)
问题在于for(i=strlen(src).....
中的reverse()
。 src[strlen(src)]
为0
(零;字符串终止)。所以当你到达printf()
时,它会看到第一个字符并输出一个空字符串。
使用strlen(str)-1
,然后在 for循环后使用*(dest+j) = 0
。
总的来说,reverse()
应为:
void reverse(char *src, char *dest) {
int i;
int j = 0;
for(i = strlen(src)-1; i >= 0; i--) {
*(dest+j) = *(src+i);
++j;
}
*(dest+j) = 0;
}