Обратная последовательность слов данной строки в C с использованием пользовательских функций - PullRequest
0 голосов
/ 28 апреля 2020

Код не работает, он не дал точных результатов. Я не знаю, где проблема или нет кодирования? Мой ввод и вывод:

Enter a sentence :
hello im here to help you
heleh im here to help you

Я использовал следующий код,

int main()
{
    /*
    Enter a sentence to get reverse of each word
    hello this is CPROGRAM Enjoy Programming
    olleh siht si MARGORPC yojnE gnimmargorP
    */
    char str[100];
    printf("Enter a sentence : \n");
    fgets(str, 100, stdin);
    revwords(str);
    fputs(str, stdout);
    return 0;
}
void revwords(char* str){
    int i = 0;
    for(int j=1;str[j] != '\0';j++){
        if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
            rev(str, i, j-1);
            i = j+1;
            j++;
        }
    }
}
void rev(char* str, int from, int to){
    char temp;
    for(int i=from;i<= to/2;i++){
        temp = str[i];
        str[to-i] = str[i];
        str[to-i] = temp;
    }
}

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020
    #include<stdio.h>

    int main()
   {
    /*
    Enter a sentence to get reverse of each word
    hello this is CPROGRAM Enjoy Programming
    olleh siht si MARGORPC yojnE gnimmargorP
    */
    char str[100];
    printf("Enter a sentence : \n");

    //fgets(str, 100, stdin);
    scanf("%[^\n]s", str);

    revwords(str);

    //fputs(str, stdout);
    printf("%s\n",str);

    return 0;
}
void revwords(char* str){
    int i = 0;
    for(int j=1;str[j] != '\0';j++){
        if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
            rev(str, i, j-1);
            i = j+1;
            j++;
        }
    }
}
void rev(char* str, int from, int to){
    char temp;
    while(from <= to){
        temp = str[from];
        str[from] = str[to];
        str[to] = temp;
        from++;
        to--;
    }
}

Вы можете попробовать этот код. В вашем коде в rev функция swap сделана не правильно. А для ввода строки вы можете использовать scanf("%[^\n]s", str);.

Еще одна ошибка в вашем коде - вы не полностью изменили последнее слово. так что за пределами для l oop в вашей функции revwords необходимо поменять местами последнее слово. , которое не исправляет этот код, попробуйте сами и, если не сможете найти, то, пожалуйста, прокомментируйте.

void revwords(char* str){
    int i = 0;
    int j;
    for(j=1;str[j] != '\0';j++){
        if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
            rev(str, i, j-1);
            i = j+1;
            j++;
        }
    }
    rev(str,i,j-1);
}

Изменитесь с этим блоком кода и надеюсь, что это решит. это просто модифицированная версия вашего кода.

0 голосов
/ 28 апреля 2020

Обе функции, rev и revwords, неверны.

Например, в общем случае пользователь может передать пустую строку. В этом случае функция revwords вызывает неопределенное поведение из-за начального условия в for l oop

for(int j=1;str[j] != '\0';j++){

Также, если переданная строка не содержит пробелов, то есть содержит только одно слово, тогда ничто не будет перевернуто.

В функции rev условие l oop неверно

for(int i=from;i<= to/2;i++){

Например, если form равно 3 и to равно 5, тогда выражение i <= to/2 дает 2 и l oop никогда не будет выполнено.

Кроме этого код, который меняет символы

    temp = str[i];
    str[to-i] = str[i];
    str[to-i] = temp;

также неверно.

И, по крайней мере, функция revwords должна иметь тип возвращаемого значения char * в соответствии с соглашением стандартных C строковых функций.

Учтите, что Функция fgets может добавить символ новой строки к введенной строке. Вы должны удалить его.

Вот демонстрационная программа, которая показывает, как функции могут быть реализованы. Я переименовал только имена функций.

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

static char * reverse( char *s, size_t n ) 
{ 
    for ( size_t i = 0; i < n / 2; i++ ) 
    { 
        char c = s[ i ]; 
        s[ i ] = s[ n - i - 1 ]; 
        s[ n - i - 1 ] = c; 
    } 

    return s; 
} 

char * reverse_by_words( char *s ) 
{ 
    const char *delim = " \t\n"; 

    char *p = s; 

    while ( *p ) 
    { 
        p += strspn( p, delim ); 

        if ( *p ) 
        { 
            char *q = p; 

            p += strcspn( p, delim ); 

            reverse( q, p - q ); 
        } 
    } 

    return s; 
} 

int main(void)  
{
    enum { N = 100 };
    char s[N];

    printf( "Enter a sentence: " );

    fgets( s, N, stdin );   

    //  remove the appended new line character '\n'
    s[ strcspn( s, "\n" ) ] = '\0';

    puts( s ); 

    puts( reverse_by_words( s ) ); 

    return 0; 
}

Вывод программы может выглядеть как

Enter a sentence: hello im here to help you
hello im here to help you
olleh mi ereh ot pleh uoy
0 голосов
/ 28 апреля 2020

Ваша функция rev нарушена несколькими способами:

void rev(char* str, int from, int to){
    char temp;
    for(int i=from;i<= to/2;i++){
        temp = str[i];
        str[to-i] = str[i];
        str[to-i] = temp;
    }
}

Первое: ваш обмен нарушен. Вы присваиваете str[to-i] дважды и никогда в другом направлении.

void rev(char* str, int from, int to){
    char temp;
    for(int i=from;i<= to/2;i++){
        temp = str[i];
        str[i] = str[to-i];
        str[to-i] = temp;
    }
}

Тогда ваш индекс не рассчитан правильно. Кажется, вы пытаетесь повернуть назад от from до to, но вы рассматриваете to, как если бы это была длина. Вам нужно использовать отдельный индекс:

void rev(char* str, int from, int to){
    char temp;
    for(int i=0; i <= (to-from)/2; i++){
        temp = str[from+i];
        str[from+i] = str[to-i];
        str[to-i] = temp;
    }
}

В противном случае, если вы вернетесь от 10..15, вы скопируете в индекс 5..0 вместо 15..10

...