C字符串处理

深藏阁楼爱情的钟 2022-08-13 12:38 293阅读 0赞

1. strsep函数要注意的问题: http://snprintf.blog.51cto.com/3676303/695760

1)被分割字串要被改变,所以不能操作存放在静态存储区的字串常量。

2) 分割符要被替换成’\0’。

3) 需要传二级指针,因为s1是指向分割字串,第一次指向源字串,调用后指向分割后的下一个token。所以s1会改变,需要传递二级指针。

对于注意1,常犯错误如下:

  1. char *str = “This is a example to test the function of strsep”;
  2. strsep(&str, “ “);

str指向的字串是静态存储区,属于字符串常量,不能修改。会出现段错误。

而对于注意3,常犯错误如下:

  1. char str[] = “This is a example to test the function of strsep”;
  2. strsep(&str, “ “);

&str是一级指针,所以也会出现段错误。

其实对于会修改源字串的函数都容易出现上面的错误。用时要格外小心注意。

特别注意:
若char* str = “test,sencond,3”
则执行 char* str1 = strsep(&str,“,”)则str1 = “test”而此时,str = “sencond,3”,即指针指向了第一次匹配的字符(这里为逗号)的下一个字符(指向了字符串“second,3”)。

  1. 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这个函数,他可以把你的字符串写入到你给他分配的空间里去。

问题总算解决了,困扰了我几天的问题终于算搞明白了,是否一点问题都没有了,还有待于以后发现。

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c#对字符串处理(全面)

    c\中较常用的字符串处理技巧: (补充:字符串为引用类型,栈中只是存了字符串的引用地址,实际字符串值存储在堆中;下边变量s就是字符串 "123" 的引用) ![2020

    相关 C#总结---字符串处理

    C\中,字符串可以看做是char的只读数组,因此,字符串一旦声明就不再可以改变(字符串的重要的特性---不可变性)。所以只能通过索引来读取指定位置的char,不能对指定位置的c