Мой код неправильно меняет строку символов из каждого отдельного слова? - PullRequest
0 голосов
/ 29 марта 2019

Я делаю присваивание, в котором мне нужно реализовать функцию reverse (), которая переворачивает строку между индексами i и j включительно. reverse (str, 0, 4) переворачивает строку между индексами 0 и 4 из яблока в elppa. Все слова можно поменять местами, найдя начальную и конечную позиции каждого слова и поменяв местами слово.

void reverse(char *str, int i, int j). for example

UserInput:

apple orange banana

выведет:

elppa egnaro ananab

но мой код ничего не печатает. Я знаю, что есть много ошибок, но я застрял и не знаю, как идти отсюда. Мой код:

#include <stdio.h>
#include <string.h>
void reverse(char *str, int i, int j);
int i, j, k, len, ind, temp;
char str[100];
int main()
{

    printf("Enter a string: \n");
    gets(str);
    len = strlen(str);
    reverse(str, i, j);
    return 0;
}
void reverse(char *str, int i, int j)
{
    for (i = 0; i < len; i++)//
    {
        ind = i;
            //index of the end of each word
        if (str[i] == ' ' || str[i] == '\n')//ends at index of whites space
        {
            ind = i - 1;//index of empty space -1
            i= 0;//i is reset to 0
            if (i <= ind)//0<last index of word
            {
                //reverse
                temp = str[i];
                str[i] = str[ind];
                str[ind] = temp;
            }
        }
      }
   printf("%s\n",str[i]);
}

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

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

void reverse(char *str, int i, int j)
{
    for (i = 0; i < len; i++)

Вы отбрасываете то, что было в переменной i, инициализируя ее нулем.Таким образом, эта функция будет делать то же самое независимо от значения, если i.

Вы также используете много глобальных переменных без веской причины.НИКОГДА не используйте глобалы, если у вас нет веских причин, и это не одна из них.Переместите объявление i, j, k, len, ind и temp в тело реверса.Переместите объявление str в main.

Переменная j никогда не используется.

НИКОГДА не используйте функцию gets.Он был удален из современного C.

printf("%s\n",str[i]); не имеет смысла.Вы пытаетесь напечатать символ i: th, но в виде строки.Это неопределенное поведение.

Включить предупреждения компилятора.Вот что я получил, когда скомпилировал ваш код:

$ gcc b.c -Wall -Wextra
b.c: In function ‘main’:
b.c:10:5: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
     gets(str);
     ^~~~
     fgets
b.c: In function ‘reverse’:
b.c:34:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
    printf("%s\n",str[i]);
            ~^    ~~~~~~
            %d
b.c:15:36: warning: unused parameter ‘j’ [-Wunused-parameter]
 void reverse(char *str, int i, int j)
                                ~~~~^
1 голос
/ 29 марта 2019

Первый принцип программирования, применяемый здесь: декомпозиция .У вас есть две задачи: определить слова во входной строке и поменять местами буквы каждого слова.Попытка сделать оба вместе гораздо сложнее, чем сделать одно из них.

Сначала напишите функцию, которая обратит одно слово, учитывая его начальный и конечный индексы, затем напишите вторую функцию, которая будет определять слова и вызыватьПервая функция, чтобы полностью изменить их.Вы можете закончить и проверить первую функцию, прежде чем пытаться использовать вторую.

...