如何仅使用指针反转字符串?

问题描述

我正试图反转一个字符串,但它保持不变。除了<string.h><stdio.h>之外,我不使用任何其他模块。

void rev(s){
    char i,temp;
    char *sf = s;
    char ri = strlen((s) - 1);
    char *sl = &s[ri];
    for (i = 0; i < ri; i++){
        if (*sf != *sl){
            temp = *sf++;
            s[i] = *sl--; //
            s[ri--] = temp; //those two seems to be getting new characters,but it won't
        }
        else {
            ri--;
            sf++;
            sl--;
        }
    }
    printf("%s",s);
}

解决方法

该函数至少不会编译,因为该参数没有类型说明符。

void rev(s){

类型char的可接受值范围很小。因此,请勿将其用于计算字符串的长度。

此声明中strlen的调用

char ri = strlen((s) - 1);

调用未定义的行为。看来你是说

char ri = strlen(s) - 1; 

还可以为空字符串调用未定义的行为。

此循环

for (i = 0; i < ri; i++){

不使用指针。

可以按照以下演示程序中所示的方式定义该功能。

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

char * reverse( char *s )
{
    if ( *s )
    {
        for ( char *first = s,*last = s + strlen( s ); first < --last; ++first )
        {
            char c = *first;
            *first = *last;
            *last = c;
        }
    }
    
    return s;
}

int main( void ) 
{
    char s1[] = "1";
    char s2[] = "12";
    char s3[] = "123";
    
    puts( reverse( s1 ) );
    puts( reverse( s2 ) );
    puts( reverse( s3 ) );
}   

程序输出为

1
21
321
,

您的代码有很多问题(错误?):

char ri = strlen((s) - 1);必须为size_t ri = strlen((s)) - 1;

其他代码很难分析,因为您使用的不是自解释变量名。

这里您的代码更加简单,而且分析起来也容易得多。

char *reverseString(char *str)
{
    char *wrk = str,*end;
    if(str && *str)
    {
        end = str + strlen(str) - 1;
        while(end > wrk)
        {
            char temp = *wrk;
            *wrk++ = *end;
            *end-- = temp;
        }
    }
    return str;
}


int main(void)
{
    char str[] = "1234567890";
    printf("reversed: %s\n",reverseString(str));
}
,

一个简单的解决方案:

char *sl = sf;
while (*sl != 0)
    ++ sl;
-- sl; 
while (sf < sl)
{
    char c = *sf;
    *sf = *sl;
    *sl = c;

    ++sf,--sl;
}

通过跳过所有字符直到找到NUL(零)字符来查找字符串的末尾。
然后退回一个字符(减量sl),以便您拥有指向字符串的第一个和最后一个字符的指针。

然后将两个指针彼此指向并交换字符,直到指针相交或交叉。