簡體   English   中英

試圖反轉 C 字符串但它不起作用

[英]Trying to reverse a C-string but it is not working

我正在嘗試反轉此 C 字符串,我認為我做對了,但字符串在通過 function 時保持不變。

#include <stdio.h>

char* reverse(char* string); 

int main(int arc, char* argv[]) {
    char word[] = "Hello World!";

    printf("%s\n", word);
    printf("%s\n", reverse(word));
    return 0;
}

char* reverse(char* string) {
    int i, j, n = 0;int len = 0;char temp;

//Gets string length
    for (i = 0; *(string + i) != '0'; i++) {
        len++;
    }

//Reverses string
    for (j = len - 1; j >= 0; j--) {
        temp = string[n];
        string[n] = string[j];
        string[j] = temp;
        n++; 
    }

    return &string[0];
}

預期 output:世界您好! !dlrow olleH

對於初學者來說,有一個錯字

for (i = 0; *(string + i) != '0'; i++) {

你必須寫

for (i = 0; *(string + i) != '\0'; i++) {

也就是說,您必須使用'\0'0而不是字符'0'

在這個for循環中

for (j = len - 1; j >= 0; j--) {
    temp = string[n];
    string[n] = string[j];
    string[j] = temp;
    n++; 
}

字符串被顛倒了兩次。:)結果你得到了相同的字符串。

function可以通過以下方式查找

char * reverse(char *string) 
{
    //Gets string length
    size_t n = 0;

    while ( string[n] != '\0' ) ++n;

    //Reverses string
    for ( size_t i = 0, m = n / 2; i < m; i++ )
    {
        char temp = string[i];
        string[i] = string[n - i - 1];
        string[n - i - 1] = temp;
    }

    return string;
}

或者可以使用指針按以下方式定義 function

char * reverse(char *string) 
{
    //Gets string length
    char *right = string;

    while ( *right ) ++right;

    //Reverses string
    if ( right != string )
    {
        for ( char *left = string; left < --right; ++left )
        {
            char temp = *left;
            *left = *right;
            *right = temp;
        }
    }

    return string;
}

不使用指針的 function 實現的相同方法可以看下面的方式

char * reverse(char *string) 
{
    //Gets string length
    size_t n = 0;    
    while ( string[n] != '\0' ) ++n;

    //Reverses string
    if ( n != 0 )
    {
        for ( size_t i = 0; i < --n; ++i )
        {
            char temp = string[i];
            string[i] = string[n];
            string[n] = temp;
        }
    }

    return string;
}

這是另一種解決方案。 我最喜歡它。 盡管它效率低下,但它並不像早期提出的解決方案那樣微不足道。 它基於一個初學者嘗試編寫一個反轉字符串的 function。:)

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

char *reverse( char *string )
{
    size_t n = 0;

    while (string[n]) ++n;

    while (!( n < 2 ))
    {
        char c = string[0];
        memmove( string, string + 1, --n );
        string[n] = c;
    }

    return string;
}

int main( void )
{
    char string[] = "Hello World!";

    puts( string );
    puts( reverse( string ) );
}

程序 output 是

Hello World!
!dlroW olleH

當然,可以使用在 header <string.h>中聲明的標准字符串 function strlen ,而不是在所有提供的解決方案中手動計算字符串的長度。

問題是輸入的word是一個數組,傳遞給反向function時衰減為一個指針。

在for循環中,不要使用n來跟蹤position,我建議你使用ij來跟蹤字符串的開始和結束,並分別遞增和遞減它們並使用strlen來獲取長度細繩。

此外,正如上面來自 Moscow 的 @Vlad所提到的,在你的for循環中你正在檢查0但它應該是\0這是 null 字符。

請在下面找到生成預期結果的已發布代碼的更新:

#include <stdio.h>

char* reverse(char* string); 

int main(int arc, char* argv[]) {
    char word[] = "Hello World!";

    printf("%s ", word);
    printf("%s\n", reverse(word));
    return 0;
}

char* reverse(char* string) {
    int i, j;
    char temp;
    int len = strlen(string);

    //Reverses string
    for (i = 0, j = len - 1; i < j; i++, j--) {
        temp = string[i];
        string[i] = string[j];
        string[j] = temp;
    }
    return &string[0];
}

暫無
暫無

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

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