Как улучшить этот алгоритм трима-полуструны? - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть простой алгоритм, который очищает пробел от половины строки до конца. Вот оно:

char a[] = "abc         "; /* The string to string to trim. */
printf("orginal [%s]\n", a);
char * org = strdup(a); /* duplicate the orginal string */
char * half_str = org + strlen(a) / 2; /* Get the half of string. */
strrev(half_str); /* reverse the string */
char * phs = half_str; /* Point to half_string */
char * news = malloc(strlen(half_str) + 1); /* The new string, without spaces. */
char * ptonews = news; /*Pointer to new string */

while(*phs) 
{
    /* if it's not whitespace like( ,\f,\r,\t,\v,\n) then concat to new string. */
    if(!isspace(*phs)) {
        *ptonews ++= *phs;      
    }
    phs ++;
}

/*Put the 0-terminator into new string. */
*phs ++ = '\0'; 

/* Replace the half_str with the newstring */
strcpy(half_str, news);

printf("new string [%s]\n", org);

работает нормально. вывод:

orginal [abc        ]
new string [abc]

Но код на C немного медленный. Как я могу улучшить это?

1 Ответ

0 голосов
/ 02 апреля 2012

Вы делаете много ненужных выделений. Попробуйте что-то вроде этого:

char a[] = "abc     ";
printf( "original [%s]\n", a);
int halfTrimmed = strlen(a)/2 + 1;
for( ; halfTrimmed>0; halfTrimmed-- )
    if( !isspace(a[halfTrimmed-1]) ) break;
char* news = malloc( halfTrimmed+1 );
strncpy( news, a, halfTrimmed );
printf( "new string [%s]\n", news );

Словом, этот алгоритм находит индекс половины строки (halfTrimmed), затем начинает смотреть на каждый символ, начиная с этого индекса, пока не найдет первый непробельный индекс. Затем он копирует с начала исходной строки до последнего непробельного индекса в новую строку, и все готово.

...