C - Обратный порядок слов в массиве строк - PullRequest
0 голосов
/ 10 декабря 2018

Я сделал эту программу, чтобы изменить порядок слов в заданной строке.(И это работает)

т.е. вывод: sentence first the is This

Однако я застрял, когда дело доходит до добавления другого предложения в массив.Например, мне нужно иметь массив {"This is the first sentence", "And this is the second"}, выводящий в качестве вывода: sentence first the is This , second the is this And

int main() {

    char str[] = {"This is the first sentence"};
    int length = strlen(str);

    // Traverse string from end
    int i;
    for (i = length - 1; i >= 0; i--) {
        if (str[i] == ' ') {

    // putting the NULL character at the position of space characters for 
    next iteration.
        str[i] = '\0';

        // Start from next character
        printf("%s ", &(str[i]) + 1);
        }
}

    // printing the last word
    printf("%s", str);

    return 0;
}

Я новичок в C, поэтому неудивительно, что я застрял, даже если решение довольно простое.Любая помощь будет оценена!Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Во-первых, вы можете попробовать с двумерным массивом или использовать массив указателей.

Во-вторых, в вашем подходе вы теряете начальное значение вашей строки, я не знаю, насколько это важноis.

Это мой быстрый подход с использованием массива указателей.

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

static void print_word(const char *str)
{
    for (int i = 0; str[i] && str[i] != ' '; i++)
        printf("%c", str[i]);
    putchar(' ');
}

int main(void)
{
    int len;
    const char *str[] = {"This is the first sentence",
                         "And this is second", NULL};

    for (int i = 0; str[i]; i++) { 
        for (len = strlen(str[i]); len >= 0; len--) {
            if (len == 0)
                print_word(&str[i][len]);
            else if (str[i][len] == ' ') 
                print_word(&str[i][len + 1]);
        }
        putchar('\n');
    }

    printf("Initial value of array of strings [%s | %s] \n", str[0], str[1]);
    return 0;
}

вывод такой:

предложение первое - это This

во-вторых, это И

Начальное значение массива строк [Это первое предложение |И это второе]

0 голосов
/ 10 декабря 2018

Я предлагаю вам использовать memcpy, но, не меняя слишком много кода, похоже, это сработает

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

#define MAX_STRING_LENGTH 100

int main()
{
    char *str[] = {"This is the first", "And this is the second sentence"};
    const size_t NUM_STRING = sizeof(str)/sizeof(char*);
    /*%z used to print size_t variables*/
    printf("%zd strings found\n", NUM_STRING);
    int length[2];
    int i;
    for (i=0; i<NUM_STRING; i++)
    {
        length[i] = strlen(str[i]);
    }
    printf("length initialized %d %d\n", length[0], length[1]);

    // Traverse string from end
    int j = 0;
    char temp[MAX_STRING_LENGTH];
    printf("\n\n");
    for (j=0; j<NUM_STRING; j++)
    {
      /*Make sure the string respect the MAX_STRING_LENGTH limit*/
      if (strlen(str[j])>MAX_STRING_LENGTH)
      {
        printf("ERROR: string %d exceding max string length %d defined in constant "
        "MAX_STRING_LENGTH. Exiting from program.\n", j, MAX_STRING_LENGTH);
        exit(1);
      }
      //reset temporary string
      memset(temp, '\0', sizeof(temp));
      //printf("temp variable reinitialized\n");
      for (i = length[j] - 1; i >= 0; i--)
      {
        temp[i] = str[j][i];
        if (str[j][i] == ' ')
        {
          // putting the NULL character at the position of space characters for  next iteration.
          temp[i] = '\0';
          // Start from next character
          printf("%s ", &(temp[i]) + 1);
        }
      }

      // printing the last word
      printf("%s ", temp);
    }
    printf("\n");


    return 0;
}
0 голосов
/ 10 декабря 2018

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

void print_words_reverse(char * const str) {
    // your current code here
}

Затем вы можете вызывать ее отдельно для каждой строки:

char strings[][30] = {
    "This is the first sentence",
    "And this is the second"
};
for (int i = 0; i < sizeof(strings) / sizeof(*strings); ++i) {
    print_words_reverse(strings[i]);
}

Обратите внимание, что поскольку вы модифицируете строку (заменяя пробелы на NUL-байты), аргумент должен быть изменяемым, что означает, что выне разрешается вызывать его (в стандарте C) с указателем на строковый литерал, что означает, что вы не можете просто использовать const char *strings[] = { "first", "second" }.Вы можете избавиться от уродливой постоянной длины (здесь 30), зарезервированной для каждой строки, если ваш код не будет изменять строку аргумента.Или вы можете иметь отдельный массив символов для каждого предложения, а затем использовать указатели на эти (изменяемые) строки.

...