我有一段代码,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文件中。因此,在十六进制中,将写入输出文件的值将以0X99
,0X89
,0X90
,0X0C
结尾。我发现了一个问题,程序删除了
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';
最佳答案
将isspace(X)
替换为X == ' '
顺便说一下,rtrim
函数会导致未定义的行为如果字符串完全由空格组成(或者字符串是空的),它将从数组的前面运行。你可能想重新设计它,或者至少在它撞到前面时让它停下来。