26Авг/090
Разворот строки
Возникла задача:
Написать функцию разворота строки без использования стандартных функций (strlen и т.п.), без выделения блоков памяти:
void ReverseString(char * str);
Своего опыта хватило только на вычисление длинны присылаемой строки:
int len; char temp = str; for(len = 0; *temp != '\0'; temp++, len++);
Но что с ним делать дальше? В общем погуглив нашел 2 очень красивых способа, ну и до кучи несколько способов с выделением памяти и стандартными функциями.
Способ первый - просто распечатать строку в развернутом виде:
void StrReverse4(char *str) { if(*str) { StrReverse4(str+1); putchar(*str); } }
Способ второй:
char *rev( char *s) { char c, *p, *q; if (s != null && *s != 0) // No empty strings, please! { q = s; while(*(++q)) ; // points q at '0' terminator; for (p = s; p < --q; p++) // ignores middle character when strlen is odd { c = *p; *p = *q; *q = c; } } return s; }
Другие способы (с выделением памяти и использованием функций для работы со строками):
char* StrReverse(char *str) { char *temp, *ptr; int len, i; temp = str; for(len = 0; *temp != '\0'; temp++, len++); ptr = malloc(sizeof(char) * (len + 1)); for(i = len - 1; i >= 0; i--) ptr[len - i - 1] = str[i]; ptr[len] = '\0'; return ptr; } char* StrReverse1(char *str) { char *temp, *ptr; int len, i; temp = str; for(len = 0; *temp != '\0'; temp++, len++); ptr = malloc(sizeof(char) * (len + 1)); for(i = len - 1; i >= 0; i--) *(ptr + len - i - 1) = *(str + i); *(ptr + len) = '\0'; return ptr; } char* StrReverse2(char *str) { int i, j, len; char temp; char *ptr = NULL; i = j = len = temp = 0; len = strlen(str); ptr = malloc(sizeof(char) * (len + 1)); ptr = strcpy(ptr,str); for(i = 0, j = len - 1; i < = j; i++, j--) { temp = ptr[i]; ptr[i] = ptr[j]; ptr[j] = temp; } return ptr; } void StrReverse3(char *str) { int i, j, len; char temp; i = j = len = temp = 0; len = strlen(str); for (i = 0, j = len - 1; i <= j; i++, j--) { temp = str[i]; str[i] = str[j]; str[j] = temp; } }
Leave a comment