Комментарии к вашему коду:
void reverse(char str[]) {
int i = 0;
int length;
// Get string length
for (i = 0; str[i] != '\0' ; ++i) {
length = i;
}
Вместо того, чтобы копировать i в длину каждый раз, когда вы можете просто подождать до конца.
size_t len = 0; // size_t is an unsigned integer that is large enough to hold the sizes
// of the biggest things you can have (32 bits on 32 bit computer,
// 64 bits on a 64 bit computer)
char * s = str;
while (*s) {
len++;
s++;
}
Хотя компилятор, вероятно, сможетчтобы сделать эту оптимизацию для вас.
Вы должны знать, однако, что есть стандартная строковая функция strlen
(#include <string.h>
), которая будет измерять длину строки символа, используя тот же общий алгоритм (смотритедля конца), но обычно оптимизируется для целевого процессора.
len = strlen(str);
Ваш код еще раз:
char reversed[1000];
Использование больших массивов хорошо для изучения и простых примеров, но вы также можетеВыделите память динамически в зависимости от размера, который вам теперь нужен.Стандартная функция для этого - malloc
, которая находится в stdlib.h
(также в malloc.h
).Память, выделенная для этой функции, также должна быть освобождена.
int * p = malloc( 8 * sizeof(int) ); // allocate an array of 8 ints
/* ... work on p ... */
free(p);
/* ... don't access the memory pointed to by p anymore ... */
p = 0;
В семействе malloc есть и другие функции.Есть calloc
, который выделяет память и очищает, устанавливает ее на 0. Существует также функция с именем strdup
(которая отсутствует в стандартном C, но очень широко доступна в string.h), которая принимает строку и выделяетдубликат этого.Это действительно просто:
char * strdup(const char * str) {
size_t len = strlen(str);
char * s = malloc(len+1);
if (!s) {
return s;
}
return strcpy(s,str); // This could have been memcpy since you know the size
// and memcpy might have been faster on many processors
}
Еще одна полезная функция выделения памяти - alloca
(не в стандарте C, но широко доступна, и аналогичные функциональные возможности доступны с массивами переменной длины в C99).Это здорово, но работает не так, как malloc
.Он выделяет память, которую можно использовать только до тех пор, пока текущая функция не вернется, поскольку эта память выделяется так же, как память для локальных переменных (из стека).
Больше вашего кода:
int j;
j = 0;
// Reverse it
for (j = 0; j < length ; ++j) {
reversed[j] = str[length - j];
}
Код:
void reverse_in_place(char * str, size_t len) {
size_t i, j;
for (i = 0, j = len - 1; i < j ; i++, j--) {
char a = str[i];
char z = str[j];
str[i] = z;
str[j] = a;
}
}
должен поменять местами порядок строк без их копирования.Для строк с нечетной длиной он не будет пытаться обменять средний символ на себя.