解一道题的时候要用到字符串分割,但是c标准库里没有类似java,python中的split()函数啊,自己写的话要用到strtok()这个函数,这可真是个让人蛋疼的函数。下面说为什么。

给出我的原始代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4
 5 int  split(char **arr,char *str,const char *del)
 6 {
 7     int count =0;
 8     char *s  = strtok(str,del);
 9     while (s)
10     {
11         *arr++ = s;
12         s = strtok(NULL,del);
13         count++;
14
15     }
16     return count;
17 }
18 int main()
19 {
20     //printf("Hello world!\n");
21     char *str = "wo shi lian wen long";
22     char *save[10] ;//= {};
23     memset(save,0,sizeof(save));
24    char buff[20];       strcpy(buff,str);25     const char *del = " ";
26     int i = split(save,buff,del);
27     int j;
28
29     for (j=0;j<i;j++)
30     {
31         printf("%s\n",save[j]);
32     }
33
34     return 0;
35 }

gcc编译器显示我在调用strtok()的时候出现段错误。

百思不得骑姐,最终在stackoverflow上找到了答案。

http://stackoverflow.com/questions/8957829/strtok-segmentation-fault

原来是因为我在调用strtok的时候会改变字符串的字面值,但这是不被允许的。因为"wo shi lian wen long"是常量字符串,被存储在只读空间中,str是个可以读写的指针,用非常量字符指针指向常量字符串本身在逻辑上就是错误的,对常量字符串进行读写操作(即应用于strtok())造成了实际错误。我的代码中给出了改正的方法,strcpy(buff,str),因为buff是个数组,str指向的常量字符串存储在数组中,而数组是在数据区储存,所以可以对数组内的数据进行读写。按照同样的思路,char buff[] = str;也可以改正错误。

想要改写指针指向的空间,就要保证指针指向的是可写的空间,强行改写只读空间是不鼓励的。

转载于:https://www.cnblogs.com/lianwl/p/3205159.html

蛋疼的strtok函数相关推荐

  1. 恶心的C语言strtok函数

    从C#.JAVA到C ,让我觉得像是从公产主义社会回到了原始社会,不顺手,所以很心里憋气!!! 函数名: strtok  功  能: 查找由在第二个串中指定的分界符分隔开的单词  用  法: char ...

  2. C和指针之字符串strtok函数

    1.strtok函数 头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok ...

  3. 【摘录】C语言中利用 strtok函数进行字符串分割

    C语言不像Java,Php之类的高级语言,对象中直接封装了字符串的处理函数.C语言中进行普通的字符串处理也经常会让我们焦头烂额--不过好在C语言 中还是提供了像strtok这样功能强大的字符串处理函数 ...

  4. bob-tong 字符串函数之Strtok()函数

    https://www.cnblogs.com/Bob-tong/p/6610806.html Strtok()函数详解:   该函数包含在"string.h"头文件中  函数原型 ...

  5. C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解

    字符串分割情况 读取文件时,C++识别的是空格和换行符,但有时候文件是以符号分割的,如逗号等 字符串本身含有特殊符号,如逗号,@等 strtok()函数 strtok()函数能够按照特定的字符分解字符 ...

  6. C语言strtok()函数:字符串分割

    1.头文件:#include <string.h> 2.定义函数:char * strtok(char *s, const char *delim);      分解字符串为一组字符串.s ...

  7. strstr函数和strtok函数的使用

    目录: strstr函数的使用 模拟实现strstr函数 strtok函数的使用 strstr函数定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该 ...

  8. strtok函数及其实现

    头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成 ...

  9. c strtok函数用法

    strtok函数用于分割字符串,原型如下: char *strtok(char *str, const char *delim); str为指向欲分割的字符串,delim为分隔符,实例如下: #inc ...

最新文章

  1. jquery如何对多个对象绑定同一事件
  2. oracle 24365,深入解析:DBA_OBJECTS中的OBJECT_ID与DATA_OBJECT_ID的区别
  3. 知识星球!!!!!!
  4. c++读取json文件_[SpringMVC]-SpringMVC架构-07-SpringMVC文件上传
  5. Android style 继承
  6. [PyTorch] 损失函数
  7. BEGINNING SHAREPOINT#174; 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 SharePoint 2013 平台...
  8. codeforces 792CDivide by Three(两种方法:模拟、动态规划
  9. 前端直接访问登录页面报错_如何实现登录、URL和页面按钮的访问控制
  10. 给DateField和DateChooser进行汉化
  11. python集合类型
  12. 7-31 查验身份证 (15 分)
  13. java 设计模式学习笔记四 prototype模式
  14. 【win】全屏、窗口化、动态修改分辨率和获取屏幕支持的所有分辨率
  15. SQL基本使用-查询表中的记录
  16. 阿里邮箱企业版在电脑PC客户端设置方法汇总
  17. Java手机游戏新流星蝴蝶剑,网页最好玩的游戏
  18. 仅需一个app就能像homeassistant一样实现跨品牌联动?
  19. f5 gtm 工作原理_[转]F5负载均衡算法及基本原理
  20. 计算机求职面试智力题:找毒药(一共n瓶水,仅有一瓶是毒药),求至少需要多少只老鼠/猪;或者求x只老鼠/猪最多可以搜索多少瓶水

热门文章

  1. PHP笔记-订货单例子
  2. Android安全笔记-Android签名文件及初略架构
  3. Web前端笔记-使用@media(媒体查询)展示及隐藏div
  4. Linux学习笔记-配置SAMBA服务
  5. Qt可执行程序写入版本信息
  6. 文法G[E]分析表分析字符串(i+)-编译原理
  7. 奥拉星插件flash下载手机版下载安装_奥拉星游戏插件
  8. 软考 计算机网络,软考-计算机网络总复习
  9. android locknow,java – Android DevicePolicyManager lockNow()
  10. 双三次插值图像旋转_4K/8K电视中的超分辨率技术到底是啥?让我来告诉你(二-插值篇)...