<程序设计实践>学习总结
字符串的处理程序:使用csvgetline函数,它由文件读入一个CSV数据行,将它放入缓冲区,在一个数组里把该行分解为一些数据域,删除引号,最后返回数据域的个数。
由于CSV数据太复杂不可能简单的用函数scanf做输入剖析,使用C标准库函数strtok.对strtok(p,s)调用将返回P中的一个标识符的指针,标识符完全由不在S中的字符构成。Strtok将元串里跟在这个字符之后的字符用空字符覆盖,用这种方式表示字符结束。在第一次调用时,strtok的第一个参数应该是原来的字符串,随后的调用都应该用NULL作为第一个参数,指明这次扫描应该从前次调用结束的地方继续下去。
函数unqutoe的功能是去除像前面例子的数据行里那些表示开头和结束的引号。它并不处理嵌套引号的问题,对于原型而言这样做已足够了。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
/****************************************************************
/* unqutoe: remove leading and trainingqutoe */
**************************************************************/
char *unqutoe(char *p)
{
if (p[0] == '"')
{
if (p[strlen(p) - 1] == '"')
{
p[strlen(p) - 1] ='/0';
}
p++;
}
return p;
}
char buf[200]; //input line buffer;
char *field[20]; //fields
/****************************************************************
/* csvvgetline: read and parse line,returnfield count
sample input : "LU",67.55,"ASHF","SHGJKH",+34,25 */
***************************************************************/
int csvgetline(FILE *fin)
{
int nfield;
char *p,*q;
if (fgets(buf,sizeof(buf),fin) == NULL)
{
return -1;
}
nfield = 0;
for (q = buf; (p=strtok(q,",/n/r"))!= NULL; q = NULL)
{
field[nfield++] = unqutoe(p);
}
return nfield;
}
int main()
{
int i , nf;
while ((nf = csvgetline(stdin)) != -1)
{
for (i = 0; i < nf; i++)
{
//在printf里用一对单引号起数据域,这起着划清界限的作用,
//还能发现空格处理不正确这类错误。
printf("field[%d]= '%s' /n",i,field[i]);
}
}
return 0;
}