简而言之,在需要宽字符的环境中,我正在解析从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。
答案 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)
在ch
和unsigned char
的范围内。 EOF
时,此代码为UB。通常的修复方法:s[i] < 0
。