无法弄清楚为什么这个修剪功能无法正常工作

时间:2011-11-11 15:05:25

标签: c gcc gcc4

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

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 个答案:

答案 0 :(得分:4)

strncpy错了。 sizeof(dest)不是你想要的(它是你机器上指针的大小)。您可能想要:end - front。相反,尝试:

memcpy(dest, front + start, end - front);
dest[end] = 0;

答案 1 :(得分:2)

sizeof(dest)没有按照你的想法做到!它返回指针的大小,而不是字符串的长度。您需要为函数提供目标的最大长度。

对于要使用orig函数的字符串strlen

答案 2 :(得分:1)

size_t end = sizeof(orig) - 1;
strncpy(dest, tmp, sizeof(dest) - 1);

你可能想要strlen而不是sizeof。

答案 3 :(得分:1)

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

在该代码中,sizeof(orig)是指针的大小。所有指针的大小都相同,在您的实现中可能只有8个。您想要使用的是strlen(orig)

答案 4 :(得分:0)

尝试此代码(它不使用临时内存):

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++;
        }
    }
}

注意:未经测试!

答案 5 :(得分:0)

您必须在函数的任何位置将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
    }
}

(我已经测试过了)