我有一段代码,其中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';发布于 2014-03-13 07:46:04
将isspace(X)替换为X == ' '
顺便说一句,如果字符串完全由空格(或字符串为空)组成,则rtrim函数将导致未定义的行为,它将从数组的前端运行。你可能想重新设计它,或者至少让它在撞到前面的时候停下来。
https://stackoverflow.com/questions/22372116
复制相似问题