簡體   English   中英

使用指針在c中反轉字符串

[英]reverse string in c using pointers

我正在嘗試使用指針來反轉字符串,但似乎不起作用,這是什么問題? 輸出olllo但應該是olleh

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


void reverse(char *cadena){

    size_t len = strlen(cadena);
    char *end= cadena;
    char *aux = cadena;
    while(*++end){}
    --end; //end points to a

    for(;len;--len){
        *aux++ = *end--;

    }

}

int main()
{

    char buffer[] = "hello";
    reverse(buffer);
    printf("%s",buffer);


    return 0;
}

該行:

*aux++ = *end--;

交換任何東西。 它只是左側分配右側的值。 您總是會遇到以字符串右半部分為中心的回文。 對於交換邏輯,您應該執行以下操作:

char tmp = *aux;
*aux = *end;
*end = tmp;

另外,您不應該真正遍歷整個字符串。 實際上,這意味着將字符串反轉,然后再次將其反轉 只需遍歷字符串的一半就應用交換邏輯,就可以了:

void reverse(char *cadena) {
    if(cadena != NULL){                                 // add some checks...    
        size_t len = strlen(cadena);
        char *end = cadena + (len > 1 ? len - 1 : 0);   // ...for safety    
        char *aux = cadena;

        for (len /= 2; len; --len) {
            char tmp = *aux;
            *aux++ = *end;
            *end-- = tmp;
        }
    }
}

解決您的錯誤

循環的問題是,當您嘗試在原處反轉字符時,最終交換已交換的字符。

我將嘗試通過顯示每次迭代中發生的事情來進行解釋。 您可以在每次迭代中的每次交換之后看到cadena的初始內容和最終( res )。 | 指針auxend當前指向的位置:

len = 5
aux  |  
     h e l l o
end          |
res: o e l l o

len = 4
aux    |  
     h e l l o
end        |
res: o l l l o

len = 3
aux      |  
     h e l l o
end      |
res: o l l l o

len = 2
aux        |  
     h e l l o
end    |
res: o l l l o

len = 1
aux          |  
     h e l l o
end  |
res: o l l l o

len = 0
=> break the loop

在解決方案上..

我的原地reverse將是這個

void reverse(char *str)
{
    if (!str || !(*str)) return;

    char *end = str + strlen(str) - 1;

    while (str < end) {
        char tmp = *str;
        *str++ = *end;
        *end-- = tmp;
    }
}

一些關鍵點:

  • 注意使用strlen查找字符串的最后一個字符
  • 您應該進行迭代,直到開始和結束指針相遇為止。 否則,您將字符串反向

您的代碼中存在三個重要錯誤:

  1. 在此代碼段中前進時,您對空字符串的處理不正確:

     char *end= cadena; // Irrelevant: char *aux = cadena; while(*++end){} --end; //end points to a 

    無論如何,您已經有了字符串長度,因此只需添加它即可。

    解決此錯誤時,請確保僅創建有效的指針,即指向對象或位於對象之后的指針。

  2. 您要遍歷整個字符串的長度,而不是一半。 如果您實際上交換了元素,那么您將交換所有內容兩次,這是非常昂貴的nop:

     for(;len;--len){ 
  3. 您正在復制而不是交換。 您沒有保存您覆蓋的值,也沒有將其存儲回它所屬的位置。

      *aux++ = *end--; } 

固定代碼:

void reverse_string(char* s) {
    char* e = s + strlen(s);
    while (s < e) {
        char t = *s;
        *s++ = *--e;
        *e = t;
    }
}

暫無
暫無

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

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