strtok函数和proc中的AT子句
1、strtok截取字符
char *tmp="a b cd e";
char *tp;
tp = strtok(tmp, " ");
//这里tp指向a
tp = strtok(NULL, " ");
//这里tp指向b
tp = strtok(NULL, " ");
//这里tp指向cd
问题:
为了获取e,这里使用tp = strtok(NULL, " ");或tp = strtok(NULL, "/");或其它的字符都可以截取到e,是说对于最后一个分隔内容,strtok第二个参数使用任何字符都可以获取到?(前提是之前已经使用strtok截取到之前所有的分隔部分)
2、proc里在PEN、FETCH和CLOSE子句中使用AT子句
proc中:
"若使用了AT子句,则在后面的SQL操作中也要指定该连接,否则操作的是缺省连接上的数据,而不是AT指定的连接。如:
EXEC SQL AT db_link_name SELECT…; EXEC SQL AT db_link_name INSERT…; EXEC SQL AT db_link_name UPDATE…; EXEC SQL AT db_link_name DECLARE cursor_name CURSOR…;
不能在PREPARE、DESCRIBE、OPEN、FETCH、CLOSE中使用AT子句。"
但我在OPEN、FETCH和CLOSE子句中都可以使用AT子句啊,
EXEC SQL AT SCD OPEN scd_cursor
EXEC SQL AT SCD FETCH scd_cursor
EXEC SQL AT SCD CLOSE scd_cursor
谢谢!
[解决办法]
1. 最后一次,就是返回最后那一个token。不管是" ",还是"/"都是没有找到分隔符,把最后那段返回了
[解决办法]
通常在declare游标时使用AT
open的时候使用AT可以编译通过吗?用不用应该都一样吧
[解决办法]
c:\Microsoft SDK\src\crt\strtok.c
/****strtok.c - tokenize a string with given delimiters** Copyright (c) 1989-2001, Microsoft Corporation. All rights reserved.**Purpose:* defines strtok() - breaks string into series of token* via repeated calls.********************************************************************************/#include <cruntime.h>#include <string.h>#ifdef _MT#include <mtdll.h>#endif /* _MT *//****char *strtok(string, control) - tokenize string with delimiter in control**Purpose:* strtok considers the string to consist of a sequence of zero or more* text tokens separated by spans of one or more control chars. the first* call, with string specified, returns a pointer to the first char of the* first token, and will write a null char into string immediately* following the returned token. subsequent calls with zero for the first* argument (string) will work thru the string until no tokens remain. the* control string may be different from call to call. when no tokens remain* in string a NULL pointer is returned. remember the control chars with a* bit map, one bit per ascii char. the null char is always a control char.**Entry:* char *string - string to tokenize, or NULL to get next token* char *control - string of characters to use as delimiters**Exit:* returns pointer to first token in string, or if string* was NULL, to next token* returns NULL when no more tokens remain.**Uses:**Exceptions:********************************************************************************/char * __cdecl strtok ( char * string, const char * control ){ unsigned char *str; const unsigned char *ctrl = control; unsigned char map[32]; int count;#ifdef _MT _ptiddata ptd = _getptd();#else /* _MT */ static char *nextoken;#endif /* _MT */ /* Clear control map */ for (count = 0; count < 32; count++) map[count] = 0; /* Set bits in delimiter table */ do { map[*ctrl >> 3] |= (1 << (*ctrl & 7)); } while (*ctrl++); /* Initialize str. If string is NULL, set str to the saved * pointer (i.e., continue breaking tokens out of the string * from the last strtok call) */ if (string) str = string; else#ifdef _MT str = ptd->_token;#else /* _MT */ str = nextoken;#endif /* _MT */ /* Find beginning of token (skip over leading delimiters). Note that * there is no token iff this loop sets str to point to the terminal * null (*str == '\0') */ while ( (map[*str >> 3] & (1 << (*str & 7))) && *str ) str++; string = str; /* Find the end of the token. If it is not the end of the string, * put a null there. */ for ( ; *str ; str++ ) if ( map[*str >> 3] & (1 << (*str & 7)) ) { *str++ = '\0'; break; } /* Update nextoken (or the corresponding field in the per-thread data * structure */#ifdef _MT ptd->_token = str;#else /* _MT */ nextoken = str;#endif /* _MT */ /* Determine if a token has been found. */ if ( string == str ) return NULL; else return string;}
[解决办法]
strtok 很蛋疼的一个函数 建议换 sscanf