c中一个好的解析器?

时间:2018-05-13 01:11:23

标签: c parsing scanf delimiter

例如,我的输入是“Tom,18”,对应于(字符串)名称,(int)年龄。

在c / c ++中,我所做的是:

char name[100] = { 0 };
char age[4] = { 0 }; //define all variables as char before parsing

char string[100] = { 0 };
const char delims[] = ","; //define delimiter
char *s = string; //pointer to string[0]

int txt_len = strcspn(s, delims); //find length between ','
for (int i = 0; i < txt_len; i++) {
    name[i] = *s; //assign to char[]
    s++; //move pointer
}
s++; //move pointer at ','

//do the same for age
txt_len = strcspn(s, delims);
for (int i = 0; i < txt_len; i++) {
    age[i] = *s;
    s++;
}
s++;
int age1 = atoi(age); //convert to int

当输入类别变得更多时,我发现这种方法并不方便。 有人能给我一些类似于scanf的想法,我可以这样做:

scanf("%s, %i",name,age) //when stdin is delimited by whitespace

谢谢!

2 个答案:

答案 0 :(得分:2)

使用strtok将输入分解为令牌,然后进行适当处理。声明是:

char * strtok ( char * str, const char * delimiters );

所以它可能看起来像:

char *delim = " ,";
char *name = strtok(input, delim);
int age = atoi(strtok(NULL, delim));

注意:输入将被修改,因此不要使用const字符串。

答案 1 :(得分:1)

很少有人会将scanf描述为“好的解析器”,但它有时会成功。如果要扫描字符串而不是流,请使用sscanf