Обратный массив с-струн - PullRequest
       17

Обратный массив с-струн

1 голос
/ 26 октября 2011

У меня есть несколько вопросов относительно массива строк в C.

У меня есть массив char *string. У меня есть строка char *, а затем я разделяю каждые 4 символа в массив строк с именем sep_str. Например, если char *string = 'The sum';, то char **sep_str равно:

0: |_| --> "The "
1: |_| --> "Sum"

Мой первый вопрос: в массиве строк в C (то есть в массиве массивов символов), будет ли нулевой завершающий символ в конце каждого sep_str [i] или только в последней позиции sep_str? Вот как я копирую string в массив строк:

    for (int i = 0; i < str_length; i++) {
        sep_str[i/4][i%4] = *ptr;
        ptr++;
    }

Мой второй вопрос: как мне обратить элементы каждой строки в sep_str? Вот как я это сделал, но я чувствую, что он выходит из массива подстроки. (так из элемента sep_str):

// Reverse each element in the array
    char temp;

    for (int i = 0; i < num_strs; i++) {

        for (int j = 0, k = 4; j < k; j++, k--) {

            temp = sep_str[i][j];
            sep_str[i][j] = sep_str[i][k];
            sep_str[i][k] = temp;
        }
    }

Ответы [ 4 ]

0 голосов
/ 26 октября 2011

Копия струн звучит хорошо для меня.Поскольку каждая строка всегда имеет 4 символа, вы можете избежать нулевого терминатора \0.В качестве альтернативы вам нужно объявить sep_str как матрицу 5x (длина / 4), чтобы хранить символ \ 0 в конце каждой строки.середина строки, заменив i -ый символ на length-i-1 -й.Вам необходимо заменить внутреннюю часть для замены k=3 на k=2.

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

char temp;

for (int i = 0; i < (num_strs - 1); i++) {
    for (int j = 0, k = 3; j < k; j++, k--) {
        temp = sep_str[i][j];
        sep_str[i][j] = sep_str[i][k];
        sep_str[i][k] = temp;
    }
}

if (num_strs > 0) {
    for (int j = 0, k = strlen(sep_str[i]) - 1; j < k; j++, k--) {
        temp = sep_str[i][j];
        sep_str[i][j] = sep_str[i][k];
        sep_str[i][k] = temp;
    }
}
0 голосов
/ 26 октября 2011

В строке C будет только один символ завершения. Но если вам нужно токенизировать строки, то каждая строка должна заканчиваться нулем.

Но до этого -

char *string = "The sum"; // should be const char* string = "The sum";

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

char string[] = "The sum";
0 голосов
/ 26 октября 2011

Если у вас нет завершающего символа в ваших строках, тогда да, вы будете вне границ массива, поскольку вы обращаетесь к sep_str [i] [4], который не является допустимым местоположением:

sep_str[0] = 'T'
sep_str[1] = 'h'
sep_str[2] = 'e'
sep_str[3] = ' '

Однако я сомневаюсь, что вы хотите иметь нулевой символ в начале вашей строки, поэтому вам нужно k = 3 в цикле for, а не k = 4.

0 голосов
/ 26 октября 2011

Мой первый вопрос: в массиве строк в C (то есть в массиве массивов символов), будет ли нулевой завершающий символ в конце каждого sep_str [i] или только в последней позиции sep_str?

Только в конце, но если вы хотите рассматривать каждый отдельный блок как отдельную строку, вам нужно добавить \0 самостоятельно.

Мой второй вопрос: как мне обратить элементы каждой строки в sep_str?

Вы могли бы сделать это с помощью указателей ...

char temp;

// Point to start of string, `str` will decay to first memory position.
char *start = str;

// Point to the end of the string. You will need to `#include <string.h>`
// for `strlen()`. Otherwise, write a `while` loop that goes until `\0` to find
// the last position.
char *end = &str[strlen(str) - 1];

// Do until we hit the middle of the string.
while (start < end) {

   // Need a temp char, no parallel assignment in C.
   temp = str[start];

   // Swap chars.
   str[start++] = str[end];
   str[end--] = str[temp];
}

Предполагая, str ваша строка.

...