c,修剪字符串和宽字符

时间:2019-01-31 14:36:58

标签: c trim widechar widestring

简而言之,在需要宽字符的环境中,我正在解析从libcurl接收的HTTP标头。标头以char *字符串的形式到达我,以通用格式

java -Dwebdriver.safari.driver=/System/Library/CoreServices/SafariSupport.bundle/Contents/MacOS/safaridriver.exe -jar selenium-server-standalone-3.141.59.jar -role node -hub 10.120.45.245:4444/grid/register -port 5558 -browser "browserName=Safari, platform=MAC, platformName=MAC, maxInstances=1"

我通过在结肠的位置写一个空值然后将其修剪成两个字符串:

name: value

我正在使用的修整功能是我自己编写的:

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

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

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

然后我将修剪后的字符串提供给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]; } 函数:

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 );
}

32766 is the highest signed 16-bit number,-1,可能很重要;并向我暗示:: (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: "翾" 正在读取字符串的末尾,这反过来暗示strlen可能返回虚假值。

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

mbstowcs

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

1 个答案:

答案 0 :(得分:2)

按1减

occurrences: A: [0, 3, 4, 4, 5, 8, 8, 9] AA: [(3,4), (4,5), (8,8)] AAA: [(3,4,4), (8,8,9)] AAB: [(4,5,6), (8,9,10)] BB: [] CA: [(7,8)] 转换数组。如果结果还包含一个空字符,请在传递给该函数的长度中加以说明。

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时,此代码为UB。通常的修复方法:s[i] < 0

相关问题