Не могу понять, почему эта функция обрезки не будет работать правильно - PullRequest
3 голосов
/ 11 ноября 2011

=============================================== ================================

void trim(const char * orig, char * dest)
{
    size_t front = 0;
    size_t end = sizeof(orig) - 1;
    size_t counter = 0;
    char * tmp = null;

    if (sizeof(orig) > 0)
    {
        memset(dest, '\0', sizeof(dest));

        /* Find the first non-space character */
        while (isspace(orig[front]))
        {
                front++;
        }
        /* Find the last non-space character */
        while (isspace(orig[end]))
        {
                end--;
        }

        tmp = strndup(orig + front, end - front + 1);
        strncpy(dest, tmp, sizeof(dest) - 1);
        free(tmp); //strndup automatically malloc space
    }
}

=============================================== ================================

У меня есть строка:

'ABCDEF / G01'

Вышеупомянутая функция должна удалить пробелы и вернуться ко мне:

ABCDEF / G01 '.

Вместо этого я получаю следующее:

'ABCDEF /'

Есть идеи?

Примечание: кавычки просто показывают, что в исходной строке есть пробелы.

Ответы [ 6 ]

4 голосов
/ 11 ноября 2011

strncpy неверно.sizeof(dest) это не то, что вы хотите (это размер указателя на вашем компьютере).Вы, вероятно, хотите: end - front.Вместо этого попробуйте:

memcpy(dest, front + start, end - front);
dest[end] = 0;
2 голосов
/ 11 ноября 2011

sizeof(dest) не делает то, что вы думаете, что он делает!Возвращает размер указателя , а не длину строки.Вам нужно указать максимальную длину пункта назначения для вашей функции.

Для строки orig вы хотите использовать функцию strlen.

1 голос
/ 11 ноября 2011
void trim(const char * orig, char * dest)
{
    size_t front = 0;
    size_t end = sizeof(orig) - 1;

В этом коде sizeof(orig) - это размер указателя. Все указатели имеют одинаковый размер, вероятно, 8 в вашей реализации. Вместо этого вы хотите использовать strlen(orig).

1 голос
/ 11 ноября 2011
size_t end = sizeof(orig) - 1;
strncpy(dest, tmp, sizeof(dest) - 1);

Вы, вероятно, хотите здесь вместо strlen размер.

0 голосов
/ 11 ноября 2011

Вы должны заменить sizeof () на strlen () везде в вашей функции. Вот рабочая редакция:

void trim(const char * orig, char * dest)
{
    size_t front = 0;
    size_t end = strlen(orig)-1;
    size_t counter = 0;
    char * tmp = NULL;

    if (strlen(orig) > 0)
    {
        memset(dest, '\0', strlen(dest));

        /* Find the first non-space character */
        while (isspace(orig[front]))
        {
            front++;
        }
        /* Find the last non-space character */
        while (isspace(orig[end]))
        {
            end--;
        }

        tmp = strndup(orig + front, end - front + 1);
        strncpy(dest, tmp, strlen(dest));
        free(tmp); //strndup automatically malloc space
    }
}

(я проверял это)

0 голосов
/ 11 ноября 2011

Попробуйте этот код (он не использует временную память):

void trim(const char * orig, char * dest)
{
    size_t front = 0;
    size_t end = strlen(orig)-1;
    size_t counter = 0;

    *dest = '\0';

    if (strlen(orig) > 0)
    {    
        /* Find the first non-space character */
        while (front < end && isspace(orig[front]) )
        {
                front++;
        }
        /* Find the last non-space character */
        while (front < end && isspace(orig[end]))
        {
                end--;
        }

        counter = front;
        while ( counter <= end )
        {
                dest[counter-front] = orig[counter];
                counter++;
        }
    }
}

ПРИМЕЧАНИЕ. Не проверено!

...