REVERSE_WORD在c中使用指针

cwxwcias  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(126)

我已经尝试了这个代码,但没有输出,也没有错误?

#include <stdio.h>
void reverse(char *p,char *v,int size){
    for(int i=size-1,j=0;i<0;i--){
        *(v+j) = *(p+i);
        j++; 
    }
}
int main(){
    char word[6] = {"hello"};
    char re_word[6];
    re_word[5]='\0';
    reverse(word,re_word,6);
    printf("%s",re_word);
}
enxuqcxy

enxuqcxy1#

使用指针,它可以看起来像这样:

void reverse(char *w, char *revw, int slen) {

    revw += slen - 1;   // forward to pos. of last letter
    revw[1] = '\0';     // one further *(revw+1) 
    while (*w)
        *revw-- = *w++; 
}

这是清楚和对称的,一旦它工作,而您的i--j++相距甚远。
slen是指字母的数量w/o终止。这里调用:

char word[] = {"hello"};
char re_word[sizeof word];
reverse(word, re_word, sizeof word - 1);

也许应该使用strlen(),但这些行显示了您如何能够并且必须不仅控制总大小,而且特别是char数组的最后一个字节。
如果没有正确的长度,reverse()必须先执行strlen(),因为它必须知道第一个字母的距离。
这个*(v+j) = *(p+i)或多或少是v[j] = p[i],并没有真正利用指针,相反。

(revw
caller)                in reverse() 
 |                          |
 v                          v

-4    -3     -2     -1     revw     +1

o      l      l      e       h      \0

             ...    revw--        revw[1]

所以revw可能不是函数内部的最佳名称;revw_first_backwards的意思是...或fill_start。但是在我向后填充之前,我在右边做了一次额外的写入以终止字符串:使用指针的数组表示法:revw[1] = '\0'.

lf3rwulv

lf3rwulv2#

首先,i < 0将始终为false,给定i = size - 1>0
你想要的是i >= 0
另外,给定size = 6size - 1将等于5,这是NULL终止符位置,因为C中的数组索引从0开始。也许可以使用C函数(如strlen())来计算长度,而不是硬编码。

void reverse(char *p, char *v, size_t size)
{
    for (int i = size - 1, j = 0; i >= 0; i--)
    {
        *(v + j) = *(p + i);
        j++;
    }
}

int main()
{
    char word[6] = {"hello"};
    char re_word[6];

    re_word[5] = '\0';

    reverse(word, re_word, 5); /* or reverse(word, re_word, strlen(word)) */
    printf("%s", re_word);
}

相关问题