Записки программиста Программирование и не только

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;
    }
}
Метки записи: Оставить комментарий
Комментарии (0) Пинги (0)

Пока нет комментариев.


Leave a comment

Trackbacks are disabled.