在C中模拟Python的strip()函数
我最近开始了一个小项目,用C语言写的,但我一直在想怎么才能模仿Python字符串对象里的strip()功能。
我查了一下fscanf和sscanf,发现它们处理字符串时会遇到第一个空白字符就停止。
fgets也没什么帮助,因为我还是会有换行符留在字符串里。我试过用strchr()来查找空白字符,然后把找到的位置设置为'\0',但这似乎也不管用。
5 个回答
如果你想要直接在一行中去掉最后的换行符,可以使用下面的代码片段:
size_t s = strlen(buf);
if (s && (buf[s-1] == '\n')) buf[--s] = 0;
为了准确模仿Python的 str.strip([chars])
方法(这是我对它的理解),你需要为一个新字符串分配空间,填充这个新字符串并返回它。之后,当你不再需要这个去掉多余字符的字符串时,你还需要释放它占用的内存,以避免内存泄漏。
另外,你也可以使用C语言的指针,直接修改原始字符串,达到类似的效果。
假设你的初始字符串是 "____forty two____\n"
,你想去掉所有的下划线和换行符'\n'
____forty two___\n
^ ptr
如果你把 ptr
改为指向 'f',并把 two
后面的第一个 '_' 替换成 '\0'
,那么结果就和Python的 "____forty two____\n".strip("_\n");
一样了。
____forty two\0___\n
^ptr
不过,这和Python的做法还是不一样。这个字符串是直接被修改的,没有第二个字符串,你也无法恢复原来的内容(原始字符串会丢失)。
Python中的字符串有个叫做strip
的方法,可以去掉字符串开头和结尾的空格。不过,在C语言中处理字符串(其实就是一串字符,以\0结尾)时,处理这两个部分的方法是完全不同的。
对于去掉结尾的空格:你需要设置一个指针(或者说是索引)指向当前字符串的结尾,也就是那个\0的位置。然后不断把指针往前移动,直到碰到字符串的开头,或者遇到一个不是空格的字符。最后,把\0放在这个非空格字符的后面。
对于去掉开头的空格:你需要设置一个指针(或者索引)指向字符串的开头。然后不断把指针往后移动,直到找到一个不是空格的字符(可能是那个结尾的\0)。接着,把剩下的字符串移动一下,让第一个非空格字符移到字符串的开头,后面的字符也相应地跟着移动。
在C语言中,没有一个标准的strip()或trim()函数的实现。也就是说,大家没有统一的写法。不过,这里有一个在Linux内核中包含的实现:
char *strstrip(char *s)
{
size_t size;
char *end;
size = strlen(s);
if (!size)
return s;
end = s + size - 1;
while (end >= s && isspace(*end))
end--;
*(end + 1) = '\0';
while (*s && isspace(*s))
s++;
return s;
}