C字符串处理
1. strsep函数要注意的问题: http://snprintf.blog.51cto.com/3676303/695760
1)被分割字串要被改变,所以不能操作存放在静态存储区的字串常量。
2) 分割符要被替换成’\0’。
3) 需要传二级指针,因为s1是指向分割字串,第一次指向源字串,调用后指向分割后的下一个token。所以s1会改变,需要传递二级指针。
对于注意1,常犯错误如下:
- char *str = “This is a example to test the function of strsep”;
- strsep(&str, “ “);
str指向的字串是静态存储区,属于字符串常量,不能修改。会出现段错误。
而对于注意3,常犯错误如下:
- char str[] = “This is a example to test the function of strsep”;
- strsep(&str, “ “);
&str是一级指针,所以也会出现段错误。
其实对于会修改源字串的函数都容易出现上面的错误。用时要格外小心注意。
特别注意:
若char* str = “test,sencond,3”
则执行 char* str1 = strsep(&str,“,”)则str1 = “test”而此时,str = “sencond,3”,即指针指向了第一次匹配的字符(这里为逗号)的下一个字符(指向了字符串“second,3”)。
- strcat()函数问题: 编译和执行都没错但是不能输出正确结果
http://blog.chinaunix.net/uid-27149258-id-3384306.html
在程序中多次用的strcat函数,但是有时候编译通过,但是执行时却出现了错误。为了进一步了解strcat函数的使用,我首先写了这样的一个测试程序:
main()
{
char *Temp=(char *)malloc(sizeof(char)*200);
Temp=”strcat”;
char *Append=” a test program!”;
strcat(Temp,Append);
printf(“%s\r\n”,Temp);
return 0;
}
这个程序,从感觉上没有错误,而且编译也不会出现错误,但是就是运行时却出现了错误,错误的地方就是在strcat这个函数处。刚开始百思不得其解,后来恍然大悟,所以就把我如何理解和处理的过程写在这里,以备以后查阅。
1、分析原因
程序错误的原因:内存不允许写入。我想到strcat要有足够的空间来保存要连接的两个字符串,而我开辟的200个字节的空间怎么会容不下这几个两个字符串。原因肯定不是空间不够,我把Temp改成定义为变量,ok可以通过。难道是strcat的第一个参数不能为指针变量,我仔细看了函数的说明没有这样的要求,所以也不是这个问题。
后来,我单步运行程序,发现了问题的症结所在。在定义了一个基类型为char类型的Temp指针变量并给他分配了200个字节的空间,但是执行到下一行就出现问题了Temp的值变了。这个原因我当时没有想到,后来仔细想想自己曾经总结过,是因为 后面的字符串被当做了字符串常量,存储到了常量区,而Temp存储这个常量区首字符地址,所以根本就不是动态分配的空间。而后面strcat试图将一个字符串写入到一个常量区,所以出现了不允许写入的问题。
原因找到了,下面就是如何解决这个问题了。
2、问题解决
为了解决这个问题,我想出了两个解决方案:
为了解决这个问题,我想出了两个解决方案:
2.1、将strcat的第一个参数定义为数组,这样就避免了其在常量区的问题,问题得到了解决,哈哈,有点得意忘形了。有人问我习惯使用指针存储字符串怎么办?
2.2、没有关系,也是有解决的办法的,使用指针,并给其分配足够的空间,下面就是赋值的问题,如果不采用像上面的赋值方式那样就可以了,但是如何把一个字符串写到一个已分配的空间。我想到了strcpy这个函数,他可以把你的字符串写入到你给他分配的空间里去。
问题总算解决了,困扰了我几天的问题终于算搞明白了,是否一点问题都没有了,还有待于以后发现。
还没有评论,来说两句吧...