簡體   English   中英

使用指針反轉字符串

[英]Using pointers to reverse a String

嘗試使用指針反轉 C 中的字符串,我似乎無法弄清楚我的代碼有什么問題。 有誰知道為什么這不起作用?

int main(void) 
{
    char sentence[100];
    printf("Enter any string: ");

    scanf("%[^\n]s", sentence);

    char *sPtr;
    sPtr = sentence;
    int length = 0;

    printf("Original string = %s\n", sentence);

    while (*sPtr != '\0') {
        ++length;
        ++sPtr;
    }

    printf("Reverse string = ");

    for (int i = length; i >= 0; --i) {
        printf("%c", *(sPtr + 1));
    }

    puts("");
    return 0;
}

錯誤在這里:

while (*sPtr != '\0') {
    ++length;
    ++sPtr;
}

此時 sPtr 指向字符串末尾,因此在第二個循環中它永遠不會遞減。

for (int i = length; i >= 0; --i) {
    printf("%c", *(sPtr+1));
}

一個可能的解決方案是這樣的:

for (int i = length; i >= 0; --i) {
    printf("%c", *(sPtr));
    --sPtr;
}

您總是在字符串末尾打印一個字符。

for (int i = length; i >= 0; --i) {
    printf("%c", *(sPtr+1));
}

應該

for (int i = length-1; i >= 0; --i) {
    printf("%c", *(sPtr-(length-i));
}

或者

   for (int i = length; i >= 0; --i) {
        sPtr--; //decrement first as sPtr will be pointing to \0 char
        printf("%c", *sPtr);
    }

這是我想出的解決方案。 感謝任何人提供的幫助!

while (*sPtr != '\0') {
    ++length;
    ++sPtr;
}

printf("Reverse string = ");

sPtr = sentence;

for (int i = length; i >= 0; --i) {
    printf("%c", *(sPtr+length));
    --sPtr;
}
  1. 為此類任務編寫單獨的函數。
  2. 當您測試函數時,嘗試減少未知因素的數量。 在你的情況不scanf只是用已知的字符串。 scanf 可能會失敗,您將不知道它是您的功能還是用戶輸入。

函數簡單,不使用庫函數。

char *reverse(char *str)
{
    char *head = str, *tail = str;

    if(str && *str)
    {
        while(*tail) tail++;
        tail--;
        while(tail > head)   
        {
            int ch = *tail;
            *tail-- = *head;
            *head++ = ch;
        }
    }
    return str;
}

https://godbolt.org/z/EgNLpF

在這個循環之后

while (*sPtr != '\0') {
    ++length;
    ++sPtr;
}

指針 sPtr 指向終止零。 因此,在下一個循環中,您將開始從終止零之后的不確定字符中輸出字符串。

for (int i = length; i >= 0; --i) {
    printf("%c", *(sPtr+1));
}

表達式*(sPtr+1)在循環中沒有改變。

考慮到您沒有反轉字符串。 您正在嘗試以相反的順序輸出字符串。 它不一樣。 此外,您正在使用 int 類型的中間變量。

要僅使用指針反轉字符串,代碼可以如下所示。

char *last = sentence;

while ( *last ) ++last;

if ( sentence != last )
{
    for ( char *first = sentence; first < --last; ++first )
    {
        char c = *first;
        *first = *last;
        *last = c;
    }
}

printf( "Reversed string = %s\n", sentence );

這是一個演示程序。

#include <stdio.h>

int main(void) 
{
    char sentence[100] = { '\0' };

    printf( "Enter any string: " );
    scanf("%99[^\n]s", sentence );

    char *last = sentence;

    while ( *last ) ++ last;

    if ( sentence != last )
    {
        for ( char *first = sentence; first < --last; ++first )
        {
            char c = *first;
            *first = *last;
            *last = c;
        }
    }

    printf( "Reversed string = %s\n", sentence );

    return 0;
}

它的輸出可能看起來像

Enter any string: Hello Jordan
Reversed string = nadroJ olleH

您可以編寫一個單獨的函數來反轉字符串。 只需將將字符串從 main 反轉的代碼移動到一個單獨的函數中,例如

#include <stdio.h>

char * reverse( char *s )
{
    char *last = s;

    while ( *last ) ++last;

    if ( s != last )
    {
        for ( char *first = s; first < --last; ++first )
        {
            char c = *first;
            *first = *last;
            *last = c;
        }
    }

    return s;
}

int main(void) 
{
    char sentence[100] = { '\0' };

    printf( "Enter any string: " );
    scanf("%99[^\n]s", sentence );

    printf( "Revresed string = %s\n", reverse( sentence ) );

    return 0;
}

如果您只想使用指針以相反的順序輸出字符串,那么程序可以非常簡單。

這個給你。

#include <stdio.h>

int main(void) 
{
    char sentence[100] = { '\0' };

    printf( "Enter any string: " );
    scanf("%99[^\n]s", sentence );

    const char *sPtr = sentence;

    while ( *sPtr ) ++ sPtr;

    printf( "Revresed string = ");

    while ( sPtr != sentence ) putchar( *--sPtr );
    putchar( '\n' );

    return 0;
}

您可以通過遞歸函數進行更簡單的實現。 例如

#include <stdio.h>

void reversed_output( const char *s )
{
    if ( *s )
    {
        reversed_output( s + 1 );
        putchar( *s );
    }
}

int main(void) 
{
    char sentence[100] = { '\0' };

    printf( "Enter any string: " );
    scanf("%99[^\n]s", sentence );

    printf( "Revresed string = ");

    reversed_output( sentence );
    putchar( '\n' );

    return 0;
}

暫無
暫無

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

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