繁体   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