我有一段代码,SAS调用一个C程序来读/写VSAM文件。

char *ltrim(char *s)
{
    while(isspace(*s)) s++;

    return s;
}

char *rtrim(char *s)
{
    char* back = s + strlen(s);

    while(isspace(*--back));

    *(back+1) = '\0';

    return s;
}

char *trim(char *s)
{
    return rtrim(ltrim(s));
}

是这样叫的
strlen(trim(XXXX))

99999899.99中存在类似于XXXX的值。它被写入VSAM文件中的COMP-3文件中。因此,在十六进制中,将写入输出文件的值将以0X990X890X900X0C结尾。
我发现了一个问题,程序删除了0C函数中的trimrtrim函数仅在值为99999899.00时才执行此操作。如果值99999899.99则不观察问题。如果值小于99999899.00则不存在问题。我觉得很奇怪,直到我读到isspace函数也考虑了以下所有因素(http://www.cplusplus.com/reference/cctype/isspace/):
' ' (0x20) space (SPC)
'\t' (0x09) horizontal tab (TAB)
'\n' (0x0a) newline (LF)
'\v' (0x0b) vertical tab (VT)
'\f' (0x0c) feed (FF)
'\r' (0x0d) carriage return (CR)
我很确定作者只想删除空格。简而言之,我只想删除空格,而不是(0X0c)Feed(FF)。我能用什么来代替这两行
while(isspace(*--back));
*(back+1) = '\0';

最佳答案

isspace(X)替换为X == ' '
顺便说一下,rtrim函数会导致未定义的行为如果字符串完全由空格组成(或者字符串是空的),它将从数组的前面运行。你可能想重新设计它,或者至少在它撞到前面时让它停下来。

08-16 21:17