我有这段代码,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';
答案 0 :(得分:3)
将isspace(X)
替换为X == ' '
BTW,如果字符串完全由空格组成(或字符串为空),则rtrim
函数会导致未定义的行为,它将从数组的前面运行。您可能想要重新设计它,或者至少在它撞到前面时停止它。