蛋疼的strtok函数
解一道题的时候要用到字符串分割,但是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函数相关推荐
- 恶心的C语言strtok函数
从C#.JAVA到C ,让我觉得像是从公产主义社会回到了原始社会,不顺手,所以很心里憋气!!! 函数名: strtok 功 能: 查找由在第二个串中指定的分界符分隔开的单词 用 法: char ...
- C和指针之字符串strtok函数
1.strtok函数 头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok ...
- 【摘录】C语言中利用 strtok函数进行字符串分割
C语言不像Java,Php之类的高级语言,对象中直接封装了字符串的处理函数.C语言中进行普通的字符串处理也经常会让我们焦头烂额--不过好在C语言 中还是提供了像strtok这样功能强大的字符串处理函数 ...
- bob-tong 字符串函数之Strtok()函数
https://www.cnblogs.com/Bob-tong/p/6610806.html Strtok()函数详解: 该函数包含在"string.h"头文件中 函数原型 ...
- C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解
字符串分割情况 读取文件时,C++识别的是空格和换行符,但有时候文件是以符号分割的,如逗号等 字符串本身含有特殊符号,如逗号,@等 strtok()函数 strtok()函数能够按照特定的字符分解字符 ...
- C语言strtok()函数:字符串分割
1.头文件:#include <string.h> 2.定义函数:char * strtok(char *s, const char *delim); 分解字符串为一组字符串.s ...
- strstr函数和strtok函数的使用
目录: strstr函数的使用 模拟实现strstr函数 strtok函数的使用 strstr函数定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该 ...
- strtok函数及其实现
头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成 ...
- c strtok函数用法
strtok函数用于分割字符串,原型如下: char *strtok(char *str, const char *delim); str为指向欲分割的字符串,delim为分隔符,实例如下: #inc ...
最新文章
- jquery如何对多个对象绑定同一事件
- oracle 24365,深入解析:DBA_OBJECTS中的OBJECT_ID与DATA_OBJECT_ID的区别
- 知识星球!!!!!!
- c++读取json文件_[SpringMVC]-SpringMVC架构-07-SpringMVC文件上传
- Android style 继承
- [PyTorch] 损失函数
- BEGINNING SHAREPOINT#174; 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 SharePoint 2013 平台...
- codeforces 792CDivide by Three(两种方法:模拟、动态规划
- 前端直接访问登录页面报错_如何实现登录、URL和页面按钮的访问控制
- 给DateField和DateChooser进行汉化
- python集合类型
- 7-31 查验身份证 (15 分)
- java 设计模式学习笔记四 prototype模式
- 【win】全屏、窗口化、动态修改分辨率和获取屏幕支持的所有分辨率
- SQL基本使用-查询表中的记录
- 阿里邮箱企业版在电脑PC客户端设置方法汇总
- Java手机游戏新流星蝴蝶剑,网页最好玩的游戏
- 仅需一个app就能像homeassistant一样实现跨品牌联动?
- f5 gtm 工作原理_[转]F5负载均衡算法及基本原理
- 计算机求职面试智力题:找毒药(一共n瓶水,仅有一瓶是毒药),求至少需要多少只老鼠/猪;或者求x只老鼠/猪最多可以搜索多少瓶水
热门文章
- PHP笔记-订货单例子
- Android安全笔记-Android签名文件及初略架构
- Web前端笔记-使用@media(媒体查询)展示及隐藏div
- Linux学习笔记-配置SAMBA服务
- Qt可执行程序写入版本信息
- 文法G[E]分析表分析字符串(i+)-编译原理
- 奥拉星插件flash下载手机版下载安装_奥拉星游戏插件
- 软考 计算机网络,软考-计算机网络总复习
- android locknow,java – Android DevicePolicyManager lockNow()
- 双三次插值图像旋转_4K/8K电视中的超分辨率技术到底是啥?让我来告诉你(二-插值篇)...