Я не получаю вывод для этого кода (Сторнирование строки).Кто-нибудь может сказать мне, почему? - PullRequest
1 голос
/ 26 сентября 2019

Я начал писать этот код для обращения строки.Но на выходе он только запрашивает ввод и затем выходит.Было бы очень полезно, если бы кто-нибудь сказал мне самое простое решение этой проблемы.

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]='\0';
    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) != '\0'; i++)
    {
        *ptr = *(OriginalString+i);
        ptr++;
    }
    *ptr='\0';
    return (char*)ptr;
}   

Я ожидаю, что выход будет 'ih' для входа 'hi'.Но я могу только дать вход, и никакой выход не приходит.

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Это утверждение

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) != '\0'; 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] = '\0';

    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 != '\0' ) ++in;

    char *out = s2;

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

    *out = '\0';

    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
0 голосов
/ 26 сентября 2019

Вы используете 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] != '\0' && n < BUFSIZE){
        n++;
    }

    reverseString[n+1] = '\0'; // 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);
}
...