Как поменять предложение слово за словом? - PullRequest
1 голос
/ 01 апреля 2020

Я пытался поменять предложение слово за словом. (как дела -> как дела) Прежде всего, я создаю предложение с символом char и реверс и темп. Предложение, данное пользователем для отмены. Temp перехватывает слово, чтобы изменить местоположение в предложении. Затем я использую strcat для объединения каждого слова. Здесь проблема. Я могу найти слово, которое является концом отправленного (принимает входные данные), но когда я пытаюсь объединить, чтобы повернуть вспять, оно добавляет это слово в предложение, и возникает ошибка. В чем проблема? enter image description here

#define _CRT_SECURE_NO_WARNINGS

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

char* subs(char* temp, char* src, int start, int end);


int main() {

    char sent[15]; //input sentence
    char rev[15];  // output sentence

    char *temp=(char*)calloc(1,sizeof(char)); //for the word

    scanf(" %[^\n]%*c", &sent);  // takin' input


    int i, end, start;
    i = strlen(sent);


    //find the beggining and ending of the indexes of the word in sentence
    while (i > 0) {     
        while (sent[i] == ' ') {
            i--;
        }
        end = i-1;
        while (sent[i] != ' ') {
            i--;
        }
        start = i + 1;

        //add the word to temp and concatenate to reverse

        temp=subs(temp, sent, start, end);

        strncat(rev, temp,end-start+3);



    }
    rev[strlen(sent)] = '\0';
    printf("%s", rev);


    return 0;
}

char* subs(char* temp, char* src, int start, int end) {
    int i = 0, control;
    // resize the temp for the wırd
    temp = (char*)realloc(temp,end-start+3);

    for (; i < (end - start) + 1; i++) {
        control = (start + i);
        temp[i] = src[control];

    }
    //adding blank and null character to end of the word.
    temp[i] = ' ';
    temp[++i] = '\0';

    return temp;

}

1 Ответ

3 голосов
/ 01 апреля 2020

Я просто скопирую мой хороший ответ из этого вопроса, который еще не был закрыт Переверните строку без strtok в C . Поэтому я не могу использовать эту ссылку, чтобы закрыть ваш вопрос как дубликат.

Стандартный подход заключается в обращении каждого слова в строке и затем в обратном порядке всей строки.

Стандарт C функция strtok не подходит в этом случае. Вместо этого используйте стандартные C функции strspn и strcspn.

Вот и вы.

#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";

    char *p = s;

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

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

            p += strcspn( p, delim );

            reverse( q, p - q );
        }
    }

    return reverse( s, p - s );
}

int main(void) 
{
    char s[] = "5 60 +";

    puts( s );

    puts( reverse_by_words( s ) );

    return 0;
}

Вывод программы:

5 60 +
+ 60 5

Если вы Если вы хотите сохранить начальные и конечные пробелы, как они были в исходной строке, то функции могут выглядеть следующим образом

#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";

    char *first = s, *last = s;

    for ( char *p = s;  *p; )
    {
        p += strspn( p, delim );

        if ( last == s ) first = last = p;


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

            p += strcspn( p, delim );

            last = p;

            reverse( q, p - q );
        }
    }

    reverse( first, last - first );

    return s;
}

int main(void) 
{
    char s[] = "\t\t\t5 60 +";

    printf( "\"%s\"\n", s );

    printf( "\"%s\"\n", reverse_by_words( s ) );

    return 0;
}

Вывод программы:

"           5 60 +"
"           + 60 5"
...