- 浏览: 369996 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
MSDN Link
https://msdn.microsoft.com/en-us/library/2c8d19sb(VS.71).aspx
strtok
下文转自
http://blog.csdn.net/morewindows/article/details/8740315
strtok源码剖析
strtok函数可以用于分隔字符串,最近看了下这个函数的源代码,其中有
这段代码非常有意思,第一眼可能不明白,为什么用个unsigned char map[32];数组来保存分隔字符。下面的map[*ctrl >> 3] |= (1 << (*ctrl & 7));更加有点古怪。在网上查了下,并没有文章来解释,因此写篇博客来解释说明下。
这个长为32的数组与后面的左移,右移操作看起来迷惑,其实如果看过《位操作基础篇之位操作全面总结》(http://blog.csdn.net/morewindows/article/details/7354571)的“位操作与空间压缩”便不难想到,这里其实是个位操作的空间压缩技巧。因此char类型的数据只会从0到255,因此建立一个哈希表来记录哪些字符要分割,需要则标记为1,否则标记为0,然后在分隔字符串时,就能直接判断字符串的该位置是否要分割。详细请见MyStrtok的实现。
运行结果如图所示(图片不能打开,请访问http://blog.csdn.net/morewindows/article/details/8740315)
https://msdn.microsoft.com/en-us/library/2c8d19sb(VS.71).aspx
strtok
char *strtok( char *strToken, const char *strDelimit );
// crt_strtok.c /* In this program, a loop uses strtok * to print all the tokens (separated by commas * or blanks) in the string named "string". */ #include <string.h> #include <stdio.h> char teststring[] = "A string\tof ,,tokens\nand some more tokens"; char seps[] = " ,\t\n"; char *token; void main( void ) { printf( "Tokens:\n" ); /* Establish string and get the first token: */ token = strtok( teststring, seps ); while( token != NULL ) { /* While there are tokens in "string" */ printf( " %s\n", token ); /* Get next token: */ token = strtok( NULL, seps ); } }
Tokens: A string of tokens and some more tokens
char* strtok_A(char *s, const char *delim) { const char *spanp; int c, sc; char *tok; static char *last; if (s == NULL && (s = last) == NULL) return (NULL); /* * Skip (span) leading delimiters (s += strspn(s, delim), sort of). */ cont: c = *s++; for (spanp = delim; (sc = *spanp++) != 0;) { if (c == sc) goto cont; } if (c == 0) { /* no non-delimiter characters */ last = NULL; return (NULL); } tok = s - 1; /* * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). * Note that delim must have one NUL; we stop if we see that, too. */ for (;;) { c = *s++; spanp = delim; do { if ((sc = *spanp++) == c) { if (c == 0) s = NULL; else s[-1] = 0; last = s; return (tok); } } while (sc != 0); } /* NOTREACHED */ }
char* strtok_func(char *strToken, const char *strDelimit) { static char *pToken = NULL; char *pchDelimit = NULL; char *pchRetToken = NULL; char ucFlag = 0; if (strToken != NULL) { pToken = strToken; } if ((*pToken == '\0') || (pToken == NULL)) { return NULL; } pchRetToken = pToken; while (*pToken != '\0') { for (pchDelimit = strDelimit; *pchDelimit != '\0'; pchDelimit ++) { if (*pchRetToken == *pchDelimit) { pchRetToken ++; break; } if (*pToken == *pchDelimit) { *pToken = '\0'; ucFlag = 1; } } pToken ++; if (ucFlag == 1) { break; } } return pchRetToken; }
下文转自
http://blog.csdn.net/morewindows/article/details/8740315
strtok源码剖析
strtok函数可以用于分隔字符串,最近看了下这个函数的源代码,其中有
unsigned char map[32]; /* 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++);
这段代码非常有意思,第一眼可能不明白,为什么用个unsigned char map[32];数组来保存分隔字符。下面的map[*ctrl >> 3] |= (1 << (*ctrl & 7));更加有点古怪。在网上查了下,并没有文章来解释,因此写篇博客来解释说明下。
这个长为32的数组与后面的左移,右移操作看起来迷惑,其实如果看过《位操作基础篇之位操作全面总结》(http://blog.csdn.net/morewindows/article/details/7354571)的“位操作与空间压缩”便不难想到,这里其实是个位操作的空间压缩技巧。因此char类型的数据只会从0到255,因此建立一个哈希表来记录哪些字符要分割,需要则标记为1,否则标记为0,然后在分隔字符串时,就能直接判断字符串的该位置是否要分割。详细请见MyStrtok的实现。
//strtok源码剖析 位操作与空间压缩 //http://blog.csdn.net/morewindows/article/details/8740315 //By MoreWindows( http://blog.csdn.net/MoreWindows ) #include <stdio.h> // strtok源码剖析 char* __cdecl MyStrtok(char * string, const char * control) { unsigned char *str; const unsigned char *ctrl = (const unsigned char *)control; static unsigned char* _TOKEN = NULL; //注意这里使用了static类型,实际的strtok函数出于线程安全会使用TLS //由于char类型占一个字节取值范围为0~255 //所以可以打个bool flag[255]这样的哈希表 //来记录哪些字符为delimiter characters //然后根据《位操作基础篇之位操作全面总结》中的位操作与空间压缩 //http://blog.csdn.net/morewindows/article/details/7354571#t6 //可以将数组大小取255/8即32 unsigned char map[32]; int count; // Clear control map for (count = 0; count < 32; count++) map[count] = 0; // Set bits in delimiter table do { //map[*ctrl >> 3] |= (1 << (*ctrl & 7));//strtok原来的代码 map[*ctrl / 8] |= (1 << (*ctrl % 8)); } 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 != NULL) str = (unsigned char *)string; else str = (unsigned char *)_TOKEN; // 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 )//strtok原来的代码 while ( (map[*str / 8] & (1 << (*str % 8))) && *str ) str++; string = (char *)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)) ) //strtok原来的代码 if ( map[*str / 8] & (1 << (*str % 8)) ) { *str++ = '\0'; break; } } // Update nextoken (or the corresponding field in the per-thread data structure _TOKEN = str; // Determine if a token has been found. if ( string == (char *)str ) return NULL; else return string; } int main() { printf(" strtok源码剖析 位操作与空间压缩\n"); printf(" - http://blog.csdn.net/morewindows/article/details/8740315 -\n"); printf(" - By MoreWindows( http://blog.csdn.net/MoreWindows ) - \n\n"); //char szText[] = "MoreWindows (By http://blog.csdn.net/MoreWindows)"; //char szFind[] = " "; char szText[] = "ab,c...d(e)f(g)hj"; char szFind[] = ",.()"; printf("原字符串为: %s\n", szText); printf("分隔后为: \n"); char *pToken = MyStrtok(szText, szFind); while (pToken != NULL) { printf("%s\n", pToken); pToken = MyStrtok(NULL, szFind); } return 0; }
运行结果如图所示(图片不能打开,请访问http://blog.csdn.net/morewindows/article/details/8740315)
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 411https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1326https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java 事件模型基础:监听器、事件、事件源、事件注册
2017-06-27 08:55 824转自 http://www.cnblogs.com/mengd ... -
深入剖析Java中的装箱和拆箱
2017-06-27 08:31 488转自 http://www.cnblogs.com/dolph ... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1881ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1086C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 969转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ...
相关推荐
### strtok函数C实现 #### 函数定义与作用 在C语言中,`strtok`函数是一种常用的方法,用于将一个字符串根据指定的分隔符分割成多个子串。本篇文章介绍了一个自定义版本的`strok`函数实现,并提供了一个简单的示例...
在深入探讨`strtok`函数的实现原理之前,我们首先需要了解`strtok`的基本功能。`strtok`是C语言标准库中的一个字符串处理函数,主要用于将一个字符串分割成多个子串,这些子串是由指定的分隔符来界定的。在实际应用...
1、出于练习的目的,strtok和strtok_r函数非常值得自己动手实现一遍,在这个过程中不仅可以更深刻地理解这两个函数的工作原理,也为以后理解“可重入”和“线程安全”这两个重要概念打下基础。 代码是自己实现的...
C语言中的`strtok`函数是一个非常实用的字符串处理函数,它主要用于将一个字符串按照指定的分隔符切割成多个子字符串。这个函数的核心在于它能够动态地处理字符串,逐次返回每个子串,直到没有分隔符为止。在深入...
总的来说,解决这道华为面试题需要扎实的C语言基础,对串口通讯的理解,以及良好的问题处理和错误恢复能力。在实际开发过程中,我们还需要考虑到实时性、效率和可维护性等因素,以满足实际项目的需求。
- `strtok()`:按分隔符拆分字符串,多次调用可遍历整个字符串。 - **正则表达式**:`preg_split()`用于正则表达式分割字符串,`ereg()`已废弃,不应再使用。 - **变量和类型转换**: - `isset()`和`empty()`...
这份面试试题涵盖了C语言的基础知识、ANSI C/C++方面的知识、指针数组、字符数组、编程语言、编译器、词法分析、常量字符串、局部变量、malloc函数、realloc函数、strtok函数、gets函数、Bool变量、const关键字、...
strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok...
在本例中,我们将深入探讨`strtok`的用法,以及如何通过它来分割字符串。 ### 1. `strtok`函数的基本概念 `strtok`函数的主要作用是根据指定的分隔符(delimiter)将一个字符串分解成多个子字符串。它的原型如下:...
嵌入式Linux领域的面试往往涉及广泛...在面试中,深入理解这些概念和技术不仅展示了扎实的编程基础,也体现了对C/C++在嵌入式Linux环境中应用的掌握程度。对于面试者来说,全面掌握这些知识将有助于在面试中脱颖而出。
总结,`strtok`函数是处理字符串分隔的利器,但使用时必须注意它对原始字符串的修改以及如何正确进行多次调用来获取所有子串。对于需要保持原始字符串不变的场景,可能需要考虑使用其他方法,如`strstr`或手动处理。
strtok的缺陷,使用strtok_s函数更新安全度 #include "stdafx.h" #include "Windows.h" #include #include using namespace std; char string1[] = "A string\tof ,,tokens\nand some more tokens"; char ...
在C/C++编程中,`strtok`函数是一种常用的字符串处理工具,用于将字符串分割成多个子串。这个函数在处理复杂格式的数据时非常有用,比如解析包含多种数据类型的字符串。在给定的场景中,我们需要从一个字符串中提取...
本资源提供了嵌入式研发工程师面试试题,涵盖了 ANSI C/C++ 方面的知识点,包括字符数组的初始化、数组的空间分配、指针数组的初始化、GCC 版本支持的编程语言、CHAR_BIT 头文件、常量字符串的定义、malloc 函数的...
3. 字符串分割:了解字符串分割的方法和实现,包括使用 strtok 函数等。 4. malloc 和 new 的区别:了解malloc和new的区别,包括它们在内存管理中的作用。 嵌入式系统 1. 交叉编译:了解交叉编译的概念和实现方法...
关键在于理解`malloc`的内存分配机制以及如何遍历新分配的内存块。 3. **单词频率统计**:这是一个涉及到文件读取、字符串处理和哈希表的问题。你可以读取文本文件,使用指针遍历每一行,然后使用`strtok`或其他...
以上解答了C语言中涉及字符串处理的一些基础面试题,实际编程中,我们需要考虑到边界条件、效率优化和错误处理等因素,确保代码的健壮性和正确性。在面试中,理解这些基本概念并能灵活运用是至关重要的。
【嵌入式面试试题解析】 在嵌入式系统开发中,C/C++语言...同样,对C语言标准库函数的理解,如`malloc()`、`printf()`、`assert()`等的使用,以及如何编写高效、可读的代码,也是衡量一个嵌入式工程师能力的重要指标。
在C++编程语言中,对于字符的处理,可以通过使用C++ strtok来进行具体的操作。那么正确的应用方法我们将会在这篇文章中为大家详细介绍,希望能对大家有所帮助,提高实际程序开发效率。
根据给定的文件信息,可以提炼出以下知识点,这些知识点均为嵌入式研发工程师面试中可能会遇到的考点: ...理解和掌握这些知识对于准备嵌入式研发工程师面试有着直接的帮助,通过复习和练习可以显著提高面试通过率。