簡體   English   中英

如何僅使用指針反轉字符串?

[英]How to reverse a string with pointers only?

我試圖反轉一個字符串,但它只是保持不變。 除了<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 ),以便您擁有指向字符串的第一個和最后一個字符的指針。

然后將兩個指針朝向彼此並交換字符,直到指針相交或交叉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM