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

Den*_*eno 3 c reverse c-strings char function-definition

我试图反转一个字符串,但它只是保持不变。除了<string.h>and之外,我不使用任何模块<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);
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

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

void rev(s){
Run Code Online (Sandbox Code Playgroud)

该类型char的可接受值范围很小。所以你不应该用它来计算字符串的长度。

strlen本声明中的调用

char ri = strlen((s) - 1);
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为。看来你的意思

char ri = strlen(s) - 1; 
Run Code Online (Sandbox Code Playgroud)

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

这个循环

for (i = 0; i < ri; i++){
Run Code Online (Sandbox Code Playgroud)

不使用指针。

该函数可以通过以下方式定义,如下面的演示程序所示。

#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 ) );
}   
Run Code Online (Sandbox Code Playgroud)

程序输出是

1
21
321
Run Code Online (Sandbox Code Playgroud)