工作中,大部分文本都是\n分隔行,由\t分隔列的数据(其实就是一个 table)。一般都行python,awk来处理,顺便读取一个字段(就是table中的单元格)非常方便。C里没有直接提供字符串split的方法,我以前一直用strtok,但是它有一个问题,比如处理一个字符串“a1\tb2\t\tc4”,分割后是"a1""b2""c4",第三个空字段被略过了,这显然不是我们的预期(导致了列错乱)。之前也没有什么好办法,今天偶然看到一个函数,strsep说是现在基本用这个了,好奇之下,试了下,果然就解决之前的问题了。


#include <stdio.h>
int main()
{
    char str[100] = "a1\tb2\t\tc4" ;
    char *s = str;
    //char *p = strsep(&s, "\t");
    char *p = strtok(s, "\t");
    while(p){
        printf("%s\n", p);
        p = strtok(NULL, "\t");
        //p = strsep(&s, "\t");
    }
    return 0;
}

输出:

a1

b2

c4


#include <stdio.h>
int main()
{
    char str[100] = "a1\tb2\t\tc4" ;
    char *s = str;
    char *p = strsep(&s, "\t");
    //char *p = strtok(s, "\t");
    while(p){
        printf("%s\n", p);
        //p = strtok(NULL, "\t");
        p = strsep(&s, "\t");
    }
    return 0;
}

输出:

a1

b2


c4


另外我百度之,这个函数返回是char *的,tcc里有warning:  assignment makes pointer from integer without a cast。gcc里倒是没试,有机会用到再看。