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