isspace:需要仅识别空间而不是其他字符

时间:2014-03-13 07:41:52

标签: c string

我有这段代码,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函数中的trim的问题。 rtrim函数仅在值为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';

1 个答案:

答案 0 :(得分:3)

isspace(X)替换为X == ' '

BTW,如果字符串完全由空格组成(或字符串为空),则rtrim函数会导致未定义的行为,它将从数组的前面运行。您可能想要重新设计它,或者至少在它撞到​​前面时停止它。