尝试反转C字符串,但不起作用

fdbelqdn  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(154)

我试图反转这个C字符串,我认为我做的是正确的,但字符串在通过函数时保持不变。

#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];
}

预期产出:你好,世界!

stszievb

stszievb1#

对于初学者来说,有一个错别字

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++; 
}

字符串被反转了两次。:)结果你得到了相同的字符串。
例如,函数可以按以下方式查找

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;
}

也可以使用指针按以下方式定义函数

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;
}

不使用指针的函数实现的相同方法可以如下所示

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;
}

这里还有一个解决方案。我最喜欢它。虽然它效率很低,但并不像早期提出的解决方案那样微不足道。它是基于一个初学者尝试编写一个反转字符串的函数。:)

#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 ) );
}

程序输出为

Hello World!
!dlroW olleH

当然,代替在所有给出的解决方案中手动计算串的长度,可以使用在报头<string.h>中声明的标准串函数strlen

lkaoscv7

lkaoscv72#

问题是输入word是一个数组,当传递给reverse函数时,它衰减为一个指针。
在for循环中,我建议您不要使用n来跟踪位置,而是使用ij来跟踪字符串的开始和结束,并分别递增和递减它们,使用strlen来获得字符串的长度。
此外,正如上面来自莫斯科的**@Vlad**所提到的,在for循环中,您正在检查0,但它应该是\0,这是空字符。
请在下面找到生成预期结果的发布代码的更新:

#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];
}

相关问题