我没有得到此代码的输出(反转字符串)。谁能告诉我为什么?

I am not getting the output for this code(Reversing a string). Can anyone tell me why?

我开始编写这段用于反转字符串的代码。但在输出中它只要求输入然后退出。如果有人告诉我这个问题的最简单解决方案,那将很有帮助。

char* ptr;

//main function
{   

    int i;
    char *OriginalString1,*OriginalString2;
    OriginalString1=(char*)malloc(100*sizeof(char));


    //Input string
    printf("Enter the string: ");
    scanf("%s", OriginalString1);
    strcpy(OriginalString2, OriginalString1);
    free(OriginalString1);

    char reversestring[sizeof(OriginalString2)];
    char revstr[sizeof(OriginalString2)];
    Reverse_String(OriginalString2, reversestring);
    for(i=0;ptr!=reversestring-1; i++)
    {
        revstr[i]=*(ptr-1);
        ptr--;
    }
    revstr[i+1]='[=10=]';
    printf("\nThe reverse string is: %s \n", revstr); 


}

//Function to reverse the string

char *Reverse_String(char *OriginalString,char reversestring[])
{

    int i;
    ptr=reversestring;
    for(i=0; *(OriginalString+i) != '[=10=]'; i++)
    {
        *ptr = *(OriginalString+i);
        ptr++;
    }
    *ptr='[=10=]';
    return (char*)ptr;
}   

我希望输入 'hi' 的输出为 'ih'。但是我只能提供输入,没有输出。

此声明

strcpy(OriginalString2, OriginalString1);

没有意义,因为指针 OriginalString2 具有不确定的值。未初始化。

以及这些声明

char reversestring[sizeof(OriginalString2)];
char revstr[sizeof(OriginalString2)];

没有意义,因为这里使用的是指针的大小,而不是指针指向的字符串的大小。

如果你的编译器支持可变长度数组,那么你可以这样写

char reversestring[strlen(OriginalString2) + 1];

函数Reverse_String使用全局变量ptr也是个坏主意。您可以在函数中定义它。

这个循环

for(i=0; *(OriginalString+i) != '[=13=]'; i++)
{
    *ptr = *(OriginalString+i);
    ptr++;
}

不以相反的顺序复制原始字符串。

该函数在演示程序中显示如下所示。

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

char * reverse_copy( const char *s1, char *s2 )
{
    size_t n = strlen( s1 );

    size_t i = 0;
    for ( ; i < n; i++)
    {
        s2[i] = s1[n - i - 1];
    }

    s2[i] = '[=14=]';

    return s2;
}

int main(void) 
{
    const char s1[] = "Hello Vijay";
    char s2[sizeof( s1 )];

    reverse_copy( s1, s2 );

    puts( s1 );
    puts( s2 );

    return 0;
}

程序输出为

Hello Vijay
yajiV olleH

如果您不想(或不允许)使用标准 C 函数 strlen 并且想使用指针,那么该函数可以采用以下方式

#include <stdio.h>

char * reverse_copy( const char *s1, char *s2 )
{
    const char *in = s1;

    while ( *in != '[=16=]' ) ++in;

    char *out = s2;

    while ( in != s1 )
    {
        *out++ = *--in;
    }

    *out = '[=16=]';

    return s2;
}

int main(void) 
{
    const char s1[] = "Hello Vijay";
    char s2[sizeof( s1 )];

    reverse_copy( s1, s2 );

    puts( s1 );
    puts( s2 );

    return 0;
}

程序输出同上

Hello Vijay
yajiV olleH

您错误地使用了 malloc 和 free,您在保存原始字符串的缓冲区上调用了 free。在使用完 originalString1 之前,您不能释放它。

下面我提供了一种反转字符串的标准方法,但通常反转会在适当的位置完成。

// Macros to make reading strings from command line into buffer more safe
#define SCANF_CFORMAT(S) "%" #S "c"
#define CSIZE(S) SCANF_CFORMAT(S)

// Size of input string, excluding NUL terminator
#define BUFSIZE 100

//Function to reverse the string
char *Reverse_String(char *originalString, char *reverseString)
{
    uint32_t i, n=0;

    // Sanity check input and output buffers
    if (!originalString || ! reverseString){ 
        return NULL;
    }

    // Find length of original string -- could have used strlen()
    while (originalString[n] != '[=10=]' && n < BUFSIZE){
        n++;
    }

    reverseString[n+1] = '[=10=]'; // NUL terminate reversed string.

    for(i=0; i < n; i++){
        reverseString[n-i-1] = originalString[i];
    }
}

void main(void)
{
    int i;

    char originalString[BUFSIZE+1];
    char reverseString[BUFSIZE+1];

    // Input string
    printf("Enter the string: ");
    scanf(CSIZE(BUFSIZE), originalString);

    Reverse_String(originalString, reverseString);

    printf("\nThe reverse string is: %s \n", reverseString);
}