strtok() 用法的深入研究.

/*author: hjjdebug
 * date: Wed Aug 12 13:38:07 CST 2020
 */
/* 当我在写一个删除字符串尾部的\r,\n 字符函数时, 发现strtok 并没有按我特定的想法走,
 * 即并不是简单的吧源字符串中的分隔符都用0替换. 也有特例. 见下面的测试程序. 只有一个字符"\n"就不是这样!!
 * 广义的讲,当第一个字符就是分界符时, strtok并没有把第一个字符替换为0, 而是把返回值指向了下一个字符串.
所以才有了如下的测试程序,
进一步研究了一下strtok */

#include
#include
const char *src1 = "abc\ndef\ruvw\nxyz";
const char *src2 = "\n";
//const char *src2 = "abc";  你可以用a做分界符分隔一下abc字串.
int main()
{
    char buf1[256];
    char buf2[256];
    strcpy(buf1,src1);
    strcpy(buf2,src2);
    char *p1=strtok(buf1,"\r\n");
    printf("buf1:<%s>, p1:<%s>\n",buf1,(p1==NULL) ? "NULL":p1);
    while(p1!=NULL)
    {
        p1=strtok(NULL,"\r\n"); //每调用一次,只是替换下个位置的分界符字符为0
        printf("buf1:<%s>, p1:<%s>\n",buf1,(p1==NULL) ? "NULL":p1);
    }
// 问题在这里,当buf2中只有一个回车时,strtok 并没有吧buf2 的\n变成0 !!
// p2也没有指向buf2,而是付给了0,这算一个bug 吗?
// 答,不算, strtok的工作原理是:
// 当第一个字符就是分界符时, strtok并没有把第一个字符替换为0, 而是把返回值指向了下一个字符串.
    char *p2=strtok(buf2,"\n");        
//    char *p2=strtok(buf2,"a");        
    printf("buf2:<%s>, p2:<%s>\n",buf2,(p2==NULL) ? "NULL":p2);
    return true;
}

运行结果, 参考如下:
 ./temp
 buf1:, p1:
 buf1:, p1:
 buf1:, p1:
 buf1:, p1:
 buf1:, p1:
 buf2:<
 >, p2:

 

你可能感兴趣的:(C,编程)