c、修剪字符串和宽字符

标签 c trim widechar widestring

简单地说,我正在解析从 libcurl 接收的 HTTP header ,在需要宽字符的环境中。 header 以 char * 字符串的形式到达我这里,采用通用格式

名称:值

我通过将 null 写入冒号的位置,然后修剪,将其分成两个字符串:

        int offset = index_of( ':', s );

        if ( offset != -1 ) {
            s[offset] = ( char ) 0;
            char *name = trim( s );
            char *value = trim( &s[++offset] );

我使用的修剪函数是我自己编写的:

char *trim( char *s ) {
    int i;

    for ( i = strlen( s ); ( isblank( s[i] ) || iscntrl( s[i] ) ) && i >= 0;
          i-- ) {
        s[i] = '\0';
    }
    for ( i = 0; ( isblank( s[i] ) || iscntrl( s[i] ) ) && s[i] != '\0'; i++ );

    return ( char * ) &s[i];
}

我知道 this answer并尝试了它推荐的修剪功能,但它们没有解决我的问题,所以暂时我又回到了我自己的。

然后,我将修剪后的字符串输入到 mbstowcs 函数:

struct cons_pointer add_meta_string( struct cons_pointer meta, wchar_t *key,
                                     char *value ) {
    wchar_t buffer[strlen( value ) + 1];
    /* \todo something goes wrong here: I sometimes get junk characters on the
     * end of the string. */
    mbstowcs( buffer, value, strlen( value ) );
    return make_cons( make_cons( c_string_to_lisp_keyword( key ),
                                 c_string_to_lisp_string( buffer ) ), meta );
}

我得到的垃圾角色似乎总是同一个:

:: (inspect (assoc :owner (meta l)))

    STRG (1196577875) at page 7, offset 797 count 2
        String cell: character 's' (115) next at page 7 offset 798, count 2
         value: "simon翾"
"simon翾"
:: (inspect (cdr (cdr (cdr (cdr (cdr (assoc :owner (meta l)))))))))

    STRG (1196577875) at page 7, offset 802 count 2
        String cell: character '翾' (32766) next at page 0 offset 0, count 2
         value: "翾"

32766 is the highest signed 16-bit number , -1,这可能很重要;对我来说,这意味着 mbstowcs 正在读取字符串的末尾,这又意味着 strlen 可能返回一个虚假值。

我能够从流中读取宽字符:

:: (assoc :x-lambda (meta l))

"λάμβδα"

我绝不是 C 专家;这是我近 30 年来所做的第一个重要的 C 项目,所以我可能会遗漏一些非常明显的东西;并非常感谢帮助。如果您有兴趣,完整的源代码是 here .

最佳答案

减少 1

mbstowcs()转换数组。如果结果还包含空字符,请在传递给函数的长度中考虑该字符。

// mbstowcs( buffer, value, strlen( value ) );
mbstowcs( buffer, value, strlen( value ) + 1);

buffer 中缺少空字符可能会搞乱以下 make_cons() .


其他

for ( i = strlen( s ); ( isblank( s[i] ) || iscntrl( s[i] ) ) && i >= 0; i-- ) 。被打破。做i >= 0之前测试s[i] .

注意is...(int ch)预计chunsigned char范围内和EOF 。当 s[i] < 0 时此代码为 UB 。通常修复:is...((unsigned char) s[i]) .

关于c、修剪字符串和宽字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54462908/

相关文章:

c++ - 给char赋负值

string - 什么时候不修剪用户输入字符串是可以接受的?

c++ - 千分之一符号 (‰) 上的 wctomb 扼流圈

c++ - 保证 char、wchar_t、char16_t、char32_t 的大小排序

MySQL 修剪 WHERE 中的值

c++ - 混合 std::wcout 和 std::cout 会出错,有什么问题吗?

C - 段错误

c - 如何使用 RubyInline 将 ruby​​ 数组转换为 C 数组?

c++ - 什么是 "extern linkage and with C language linkage"

Javascript 拆分空格分隔的字符串并 trim 额外的逗号和空格