如何将strtok截取的字符串截取放进二维字符数组中

标准C中strtok函数分割字符串_Linux编程_Linux公社-Linux系统门户网站
你好,游客
标准C中strtok函数分割字符串
来源:Linux社区&
作者:Linux
标准C中可以用strtok函数来分割字符串,strtok函数的使用与其他大部分函数的使用方法不同。
函数为:char *strtok(char *strings,const char *tokseps);其中strings为要分割的字符串,tokseps是用来分割的字符。
用以下的例子进行分析:
第6行声明字符串为字符型数组,但当声明为指针型(char *strings = "hello,world!\nwelcome to the earth\")时,编译能够
通过,但是运行时会出现段错误,不知道是什么原因,还要请教一下各位。
第8行tokseps为分隔符,&,&、&\n&、& &
第9行pt用来接收分割出来的字符串
注意:strtok函数的返回值是分割后剩下字符串的指针,所以分割出一个子字符串之后,再次调用时要用NULL代替第一个参数
例如第15行。
1 #include&stdio.h&2 #include&string.h&34 int main()5 {6& & & &
char strings[] = "hello,world!\nwelcome to the earth\n";7& & & &
puts(strings);8& & & &
char *tokseps = ",\n ";9& & & &
char *1011& & & &
pt = strtok(strings,tokseps);12& & & &
while(pt)13& & & &
{14& & & & & & & &
puts(pt);15& & & & & & & &
pt = strtok(NULL,tokseps);16& & & &
}1718& & & &
return 0;19 }
输出为:helloworld!welcometotheearth
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 19, 距离下一级还需 181 积分
论坛徽章:0
我现在的问题是要把例如&1& & 2& & 3&的字符串截成1,2,3,然后做1+2+3
最后输出&1+2+3=6&。怎么做?我用strtok写了个程序如下:
$string=&1& & 2& & 3&;
$tok = strtok($string,& "
$part[0] = $
while ($i&3) {
& & & & $part = strtok(& "
& & & & $i=$i+1;
& & & & echo part[0].&/n&;
& & & & echo part[1].&/n&;
echo part[1].&/n&;这句话总是没有输出,为什么?如何才能把得到的1,2,3保存起来然后做加法。谢谢!
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:1
如何用strtok截取一个字符串,将截得的内容放在变量中
$string=&1 2 3&;
$string = str_replace(& &, &+&, $string);
eval ('$test = '.$string.';');
echo $string .&=&. $
?&;
复制代码
白手起家, 积分 19, 距离下一级还需 181 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
to夜猫子:
我想我没表达清楚我的意思,我再说一下。现在有一个字符串是&1& & 2& &3&,我要得到这字符串里面的三个数字,然后重新组合出一个字符串,并把这三个数字做一些数学操作,然后给出一个例如&1 add 2 other 3 is 6&这样的字符串。
还有就是我那段代码的while循环中的echo part[1].&/n&; 为什么没有输出?我不是已经在上面做过赋值了么?如果我把$part = strtok(& " 改成echo $part = strtok(& " 就有输出,为什么?
白手起家, 积分 21, 距离下一级还需 179 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
$string=&1 2 3&;
$tok = strtok($string,& "
while ($tok !== FALSE) {
& & & & $part[] = $
& & & & $tok = strtok(& "
foreach ($part as $v) {
& & & & echo &$v&br&;&;
& & & & $SUM += $v;
$string = implode(' add ',$part);
echo &$string is $SUM&;
家境小康, 积分 1377, 距离下一级还需 623 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
还是没看明白楼主的意思~~~~
$str = &1 2 3&;
eregi_replace(& &, &+&, $httphost);
用正则表达式不是方便得多么?
白手起家, 积分 19, 距离下一级还需 181 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
我把我要做的给出吧,本来想简化的,发现我的抽象能力不好。
有个文本,里面都是这样的内容:
192.1.2.3& & & && && &&&0.0.255.255& && && && && && && && &1.2.3.4
我现在要做的是用ip2long()把ip转化成long型
然后要得到这样的结果:
The ip is from
注:ip2long(192.1.2.3)=
& & ip2long(0.0.255.255)=65535
应该怎么做?
家境小康, 积分 1377, 距离下一级还需 623 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
$iplist = &192.168.1.1 192.168.1.2 192.168.1.3&;
for($i=1;$i&=3;$i++)
$tmp = strstr($iplist, ' ');
$ip[$i] = eregi_replace($tmp, &&, $iplist);
$l_ip[$i] = ip2long($ip);
$iplist = $
大概意思就是这样吧~~~
数组$ip和$l_ip存的就是结果~~~要加要减的再随便操作~~~
还有可以用whlie来循环,这样要判断$tmp是不是为NULL。你自己写吧~
不保证语法正确,意思就是这个~
白手起家, 积分 19, 距离下一级还需 181 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
to mikespook :
我试了一下,还是一样,得不出结果,
$iplist = &192.168.1.1 192.168.1.2 192.168.1.3&;
for($i=1;$i&=3;$i++)
$tmp = strstr($iplist, ' ');
$ip[$i] = eregi_replace($tmp, &&, $iplist);
$l_ip[$i] = ip2long($ip);
$iplist = $
echo $ip[1].&\n&;
结果:192.168.1.1
echo $ip[2].&\n&;
结果:& &空白
echo $ip[3].&\n&;
结果:& &空白
这是为什么?难道循环里面赋值的到循环外就访问不到了?
longnetpro 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽
白手起家, 积分 19, 距离下一级还需 181 积分
论坛徽章:0
如何用strtok截取一个字符串,将截得的内容放在变量中
感谢大家,问题已经基本解决,由于三个ip之间的空格不能确定,所以我用了$ip = preg_split('/ \s*/', $iplist); 其余都和longnetpro&&说的一致。strtok():“字符串分割”实用函数
最近一直纠结于一个十分简单的问题:如何将一个字符串按标志分割开来?提出这个问题的初衷是自己在处理一个将命令行字符串转换为argc,argv格式的问题。
尝试了很多种方法,最后觉得利用strtok()函数来实现是一个比较好的方法。首先进行strtok()函数的介绍。
char *strtok(string, control);
--- Tokenize string with delimiter in control.
--- 通过分割符控制将字符串切片化。
strtok considers the string to consist of a sequence of zero or more text tokens separated by spans of one or more control chars. The first call, with string specified, returns a pointer to the first
char of the first token, and will write a null char into string immediately following the returned token. Subsequent calls with zero for the first argument (string) will work through the string until no tokens remain. The control string may be different from
call to call. When no tokens remain in string a NULL pointer is returned. Remember the control chars with a bit map, one bit per ASCII char. The null char is always a control char.
strtok认为字符串是由一个或多个文本切片组成,这些文本切片被一个或多个字符分隔开来。第一次调用时,返回第一个文本切片的第一个字符指针,同时将该文本切片后的控制字符设为NULL。此后的调用重复上面的操作,直到没有文本切片首字符返回(返回NULL)为止。这些控制字符可能在不同的调用中而不同。当字符串中没有文本切片时,则返回NULL。首次调用时,string指向要分解的字符串,之后再次调用要把string设成NULL。strtok在string中查找包含在delim中的字符并用NULL('/0')来替换,直到找遍整个字符串。
char *string --- string to tokenize, or NULL to get next token
char *control --- string of characters to use as delimiters
Return pointer to first token in string, or if string was NULL, to next token. Return NULL when no more tokens remain.
Source Code:
static char *
/* Parse S into tokens separated by characters in DELIM. If S is NULL, the last string strtok() was called with is used. For example:
char s[] = "-abc-=-def";
x = strtok(s, "-");
// x = "abc"
x = strtok(NULL, "-=");
// x = "def"
x = strtok(NULL, "=");
// x = NULL
// s = "abc\0=-def\0"
char *strtok (s, delim)
const char *
if (s == NULL)
/* Scan leading delimiters. */
//strspn : 返回字符串s中第一个不在指定字符串delim中出现的字符下标
//将指针移到第一个非delim中的字符的位置
s += strspn (s, delim);
if (*s == '\0')
return NULL;
/* Find the end of the token. */
// char *strpbrk(const char *token, const char *delim);
// 依次检验字符串s中字符,当被检验字符在字符串delim中也包含时,则停止检验,并返回该字符位置,空字符NULL不包括在内
// 获取到delim中字符在字符串s中第一次出现的位置
s = strpbrk (token, delim);
if (s == NULL)
/* This token finishes the string. */
olds = __rawmemchr (token, '\0');
/* Terminate the token and make OLDS point past it. */
*s = '\0';
olds = s + 1;
}//其实现的核心方法在于static char *的方法,用于保存前次处理后的字符串。
举例说明:
将字符串”Hello,Brief,Kitty”字符串分割为”Hello”、”Brief”、”Kitty”。
代码可以这样实现:
int main()
char str[] = "Hello,Brief,Kitty";
char *token[3];
char *buf =
while((token[i] = strtok(buf, ",")) != NULL)
buf = NULL;
for(i=0;i<3;i++)
printf("%s\n",token[i]);
}现在,基于一般的命令行处理,现有以下代码:
#define MAXLEN 1024
#define MAXCOUNT 64
int main()
int i,argc=0;
char *argv[MAXCOUNT],*
char cmdline[MAXLEN];
printf("Please input the command line to be parsed:\n");
if((buf=fgets(cmdline,MAXLEN,stdin))==NULL)
printf("input error!\n");
while((argv[argc] = strtok(buf, " ")) != NULL)
buf = NULL;
printf("There is %d arguments:\n",argc);
for(i=0;i<i++)
printf("%s\n",argv[i]);8809人阅读
函数原型:char *strtok(char *s, char *delim);
函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果。
函数使用说:
1.strtok函数的实质上的处理是,strtok在s中查找包含在delim中的字符并用NULL(&/0&)来替换,直到找遍整个字符串。这句话有两层含义:(1)每次调用strtok函数只能获得一个分割单位。(2)要获得所有的分割单元必须反复调用strtok函数。
2.strtok函数以后的调用时的需用NULL来替换s.
3.形参s(要分割的字符串)对应的变量应用char s[]=&&.&形式,而不能用char *s=&&.&形式。
例子如下:
#include &stdio.h&&
#include &string.h&
int&main(void)
&&&&& char buf[]=&Golden Global View&;
&&&&&&char* token = strtok( buf, " ");
&&&&& while( token != NULL )
&&&&&&&&&& printf( &%s &, token );
&&&&&&&&&& token = strtok( NULL, & &);
&&&&& return 0;
其结果为:
但是如果我们把char buf[]=&Golden Global View&;换成char *buf=&Golden Global View&; 则会出错,原因是如果分配的大小一样的前提下char *p和char b[]也是有区别的,char *p="abc";char b[]="abc";当这两个语句编译后,编译器会将&abc&放在常量区中,而strtok(char *s, char *delim)函数是在s中查找包含在delim中的字符并用NULL(&/0&)来替换,直到找遍整个字符串。这句话就能体现指针和数组的区别:既然查找就要p++/b++。 要替换成(&/0&),那么就要对*p/*b赋值*p='/0';*b='/0';p指针是指向常量字符串的,对*p操作就是对字符串操作,这显然会编译不通过的。b是字符数组的首地址,这个数组里面的元素是&a&、'b'、'c'、'/0',和字符串&abc&看上去是一样,不过并不是同一个。相当于,b数组里可以存放其他东西'1'、'2'、'3'、'/0',只不过在编译到char b[]="abc";后给这个b数组里的元素值改变了,所以对*b的操作并不影响字符串。
如果我们把token = strtok( NULL, & &);换成token = strtok( buf, " ");则while循环会成为一个无限循环,而输出的结果就只为:Golden。我的解释原因如下: 在strtok函数体中有一个char 类型的指针(假设为 char *p),它的作用就是令p=s,用于保存s的起始地址。由于在随后的处理中指针p的值会一直保存(C语言中指针的特点),因此在以后的strtok调用中用NULL来代替s的原因就是防止p被重新赋值而指向s的起始地址,从而可以保证p可以指向s的其他位置,直到最后分割完整个字符串。 但是如果用s来代替NULL,那么每次调用strtok时,p就会指向s的初始地址,从而只能获得第一个分割出来的字串,如上面的例子中while会是一个无限循环,而输出的结果只能是&Golden&。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:152016次
积分:1952
积分:1952
排名:千里之外
原创:37篇
转载:27篇
(2)(1)(1)(1)(3)(1)(2)(1)(1)(1)(1)(1)(1)(1)(2)(1)(2)(2)(1)(2)(1)(1)(1)(4)(1)(3)(7)(2)(5)(2)(8)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 mysql 字符串截取 的文章

 

随机推荐