1

Тема: Не виходить міняти слова місцями

При введенні з файлу все працює чудово,однак коли отримуємо речення з клавіатури чомусь останній символ останнього слова(в кінці програми вже першого) зникає.https://replace.org.ua/uploads/images/9066/1ab4d4036b906e7b779137312c66a594.png


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

#define S 15 
#define MAX 150 


int ReadFile(char** str);
void ReverseStrings(char* str); 
void ShowStrings(int len, char** str);


int main()
{
    system("chcp 1251");

    int length = S; 
    char** strings = (char**)malloc(S * sizeof(char*));
    char buffer[MAX]; 
    int number;


    puts("Отримати дані з клавіатури чи файлу? 1 - file, будь-яке інше число - keyboard");
    scanf("%i", &number);
    if (number == 1)
    {
        length = ReadFile(strings);
        puts("Речення:\n");
        ShowStrings(length, strings);
        puts("\n");
    }
    else
    {
        puts("Введіть речення (0 - кінець)");
        for (length = 0; length < S; )
        {
            gets_s(buffer);
            if (strcmp(buffer, "0") == 0)
            {
                break;
            }
            strings[length] = (char*)malloc(strlen(buffer) + 1);
            strcpy(strings[length++], buffer);
        }
    }
    puts("\nРечення в зворотньому порядку слів\n");


    for (int i = 0; i < length; i++)
        ReverseStrings(strings[i]); 

    for (int ii = 0; ii < length; ii++)
    {
        if (strings[ii])
            free(strings[ii]); 
    }
    free(strings);

    system("pause");
    return 0;
}

int ReadFile(char** str) 
{
    char filename[20];
    char buf[100] = { 0 };
    int j = 0;
    FILE* file;
    if ((file = fopen("D:\\textlab\\lab08.txt", "r+")) == NULL)
    {
        puts("Error orening file");
        return 0;
    }
    else
    {
        while (fgets(buf, 100, file) != NULL) 
        {
            str[j] = (char*)malloc(strlen(buf) + 1);  
            strcpy(str[j], buf);
            j++;

        }
        fclose(file);
        return j;
    }
    return 0;
}

void ReverseStrings(char* str) 
{
    char* reverse = (char*)malloc((strlen(str) + 1)); 
    int len, i, index, wordStart, wordEnd;
    len = strlen(str);
    index = 0;

    wordStart = len - 2;
    wordEnd = len - 2;


    while (wordStart > 0)
    {
        if (str[wordStart] == ' ')
        {
            i = wordStart + 1;
            while (i <= wordEnd)
            {
                reverse[index] = str[i];
                i++;
                index++;
            }
            reverse[index++] = ' ';
            wordEnd = wordStart - 1;
        }
        wordStart--;
    }

    for (i = 0; i <= wordEnd; i++)
    {
        reverse[index] = str[i];
        index++;
    }

    reverse[index] = '\0';
    printf("%s\n", reverse);
    free(reverse);
}

void ShowStrings(int len, char** str)
{
    for (int i = 0; i < len; i++)
        printf("%s", str[i]);
}
Подякували: LoganRoss1

2

Re: Не виходить міняти слова місцями

https://replace.org.ua/uploads/images/9066/6159e513c53faf2eff8ec96e8b2b31a6.png

3

Re: Не виходить міняти слова місцями

типу довго код копати напевне десь символ загубив, збільш свій буфер чи що там на 1.

4

Re: Не виходить міняти слова місцями

Зверніть увагу на цей шмат коду:

    wordStart = len - 2;
    wordEnd = len - 2;

Чому ви віднімаєте 2? Цією дією ви відрізаєте останній символ в рядку.

    wordStart = len - 1;
    wordEnd = len - 1;

+ лайк за оформлення коду

Подякували: svyatvasik, leofun012