strtok函数读写冲突问题

先上测试代码

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const char* split = ";";
    char* str = "Hello;world;";
    //result = NULL;
    char* result = strtok(str, split);
    cout << result;
    cin.get();

    return 0;
}

运行后

strtok函数在运行时,报堆栈读写冲突问题,后来看到strtok.c源文件里面对字符串的操作如下

 /* 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;
                }

函数原理是,在函数执行中,当遇到分隔符的时候,会在原字符串查找到分隔符的位置自动替换成空字符,看来是字符串有问题,strtok()会改字符串内容,char *str = "Hello;world;";实际上先是在文字常量区分配了一块内存放"Hello;world;",然后在栈上分配一地址给str,并指向这块地址,然后改变常量";"自然会崩溃,然后改了一下代码

#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const char* split = ";";
    char str[] = "Hello;world;";
    //result = NULL;
    char* result = strtok(str, ";");
    cout << result;
    cin.get();

    return 0;
}

将原有的char * str="Hello;world;";改成char str[] = "Hello;world;";因为后者的字符串数据并不是放在常量区,所以可以修改,所以就不报错了

时间: 2024-07-31 09:18:26

strtok函数读写冲突问题的相关文章

Hdu 1106 排序 (atoi函数与 strtok函数的应用

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1106 好久都没刷题了,今天突然特别怀念以前刷题的日子,所以就找了几道水题来做做~~呵呵 在写这篇博客之前呢,已经很明了自己已经大三了,时光匆忙,在还没来得及转过头来,就已经过了两年了大学,原来走了这么远了~~感觉再怎么样,大三还是不敢偷懒~~不过有时候还真是挺迷茫的说实话,在这里呢,真心希望能得到你们各位的建议,只要是对我未来就业有好处的,我都会虚心取纳,(BTW:我是学嵌入式方向的)万分感谢~~~

用strtok函数分割字符串

用strtok函数分割字符串 需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数. //Body response 内容: <BODY><; PRE>//OK[8,7,5,15,6,5,0,4,0,3,0,3,2,0,0,0,1 用web_reg_save_param取出“8,7,5,15,6,5,0,4,0,3,0,3,2,0,0,0,1”这一段,然后用strtok函数切割出一个个数字,第四个数字就是要找的值 例如: extern char * st

strtok函数的使用与实现

一个用来分割字符串的函数: strtok char * strtok ( char * str, const char * delimiters ); Split string into tokens A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are

strtok函数

strtok函数是cstring文件里的函数 strtok函数是cstring文件里的函数 其功能是截断字符串 原型为:char *strtok(char s[],const char *delin); s[]是要截断的字符串,delin是用来截断的字符串. 每次调用成功后则返回切割出片段的指针. 比如,strtok("aaa,sa",",");第一次运行就会返回','之前的aaa #include<iostream> #include<cstri

strtok函数的简单应用 hdu 1106

排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 38231    Accepted Submission(s): 10832 Problem Description 输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非这个整数就是

关于strtok函数【转】

strtok()这个函数大家都应该碰到过,但好像总有些问题, 这里着重讲下它 首先看下MSDN上的解释: char *strtok( char *strToken, const char *strDelimit ); Parameters strToken String containing token or tokens. strDelimit Set of delimiter characters. Return Value Returns a pointer to the next tok

第五篇:使用无缓冲IO函数读写文件

前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文件 read write 函数 3. 修改文件指针 lseek 函数 ( 可能和 2 交替进行 ) 4. 关闭文件 close 函数 代码示例 1 // 2 // 本程序往一个文件中写入一个整型数组 3 // 然后读取这个数组并输出 4 // 5 6 #include <unistd.h> 7 #

Hash表的hash函数,冲突解决方法有哪些

最常用的3个HASH函数: 1. 除法散列法:通过取k除以m的余数,来将关键字k映射到m个槽的某一个中去,即散列函数为: h(k) = k mod m 2. 乘法散列法:首先,用关键字k乘上常数A(0<A<1),并抽取kA的小数部分:然后,用m乘以这个值,再取结果的底(即整数部分).散列函数可表达为: h(k) = ⌊m(kA mod 1)⌋ 3.全域散列法(universal hashing) 解决冲突常用的两种方法: 1. 链接法(chaining):把散列到同一槽中的所有元素都存放在一个

C++中关于strtok()函数的用法

strtok: #include <string.h> char *strtok(char *str, const char *delim); char *strtok_r(char *str, const char *delim, char **saveptr); 功能:分解字符串为一组标记串.str为要分解的字符串,delim为分隔符字符串. 说明:首次调用时,str必须指向要分解的字符串,随后调用要把s设成NULL. strtok在str中查找包含在delim中的字符并用NULL('/0