修剪C中的字符串

Ori*_*rds 21 c string winapi

简述:

String.Trim使用win32和标准C api(使用MSVC2008进行编译,因此我可以访问所有C++的东西,如果需要,但我只是试图修剪一个char*).

鉴于存在strchr,strtok以及其他字符串函数的所有方式,肯定应该有装饰功能,或者一个可以改变用途...

谢谢

And*_*ant 21

没有标准的库函数可以做到这一点,但滚动自己并不难.关于这样做的问题有一个现有的问题,用源代码回答.

  • 感谢那.我发现它没有库函数(如果每个人都自己滚动,那么他们都会以各种不同的方式错误地处理unicode等),但是我觉得这就是它... (3认同)
  • 呵呵。C 是在 72 年发明的。Unicode 直到 90 年代才出现。在 C 的大部分历史中,只有 ASCII 和 str[x]='\0'; 会做得很好。 (2认同)

JRL*_*JRL 12

这让我想写自己的 - 我不喜欢那些提供的.在我看来应该有3个功能.

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)); 
}
Run Code Online (Sandbox Code Playgroud)

  • 是什么阻止 rtrim 直接越过字符串的开头?对我来说看起来不安全... (3认同)
  • 编辑:审阅我代码的人建议我检查NULL输入值..也许这是您可能要添加的东西 (2认同)
  • `ltrim` 返回一个不适合传递给 `free` 的指针。如果您使用它(或者,当然,“trim”),请确保保留原始指针 - 特别是不要在没有先将“s”存储在其他地方的情况下尝试诸如“s = trim(s);”之类的操作。 (2认同)

Joh*_*n T 11

您可以使用ctype.h中的标准isspace()函数来实现此目的.只需比较字符数组的开头和结尾字符,直到两端都不再有空格.

"空间"包括:

''(0x20)空格(SPC)

'\ t'(0x09)水平标签(TAB)

'\n'(0x0a)换行符(LF)

'\ v'(0x0b)垂直制表符(VT)

'\ f'(0x0c)feed(FF)

'\ r'(0x0d)回车(CR)

虽然没有任何功能可以为您完成所有工作,但您必须重复自己的解决方案,以反复比较给定字符数组的每一侧,直到没有空格.

编辑:

由于您可以访问C++,Boost有一个修剪实现等着您,让您的生活更轻松.


qrd*_*rdl 5

惊讶地看到这样的实现。我通常是这样修剪的:

char *trim(char *s) {
    char *ptr;
    if (!s)
        return NULL;   // handle NULL string
    if (!*s)
        return s;      // handle empty string
    for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
    ptr[1] = '\0';
    return s;
}
Run Code Online (Sandbox Code Playgroud)

它快速可靠 - 为我服务多年。

  • 哦,我认为这会导致缓冲区欠载,请考虑: char buffer[] = " "; 修剪(缓冲区);然后你至少读取缓冲区 [-1],如果它是随机的空白,你甚至会写出你的缓冲区。 (2认同)