码迷,mamicode.com
首页 > 其他好文 > 详细

strtok函数读写冲突问题

时间:2015-04-16 17:15:06      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

先上测试代码

#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;";因为后者的字符串数据并不是放在常量区,所以可以修改,所以就不报错了

strtok函数读写冲突问题

标签:

原文地址:http://www.cnblogs.com/djzny/p/4432453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!