使用sscanf

时间:2016-06-08 10:40:54

标签: c

我需要用fgets分析字符串以前的读者,

然后我有一行:

name age steps\n
mario 10 1 2 3 4\n
joe   15 3 5\n
max   20 9 3 2 4 5\n

每列有不同数量的步骤, 然后我可以用

来读取姓名和年龄
 sscanf(mystring, "%s %d", name, &age);

之后我有一个for循环阅读所有步骤

   int step[20];
   int index=0;
   while(sscanf(mystring,"%d", &step[index++])>0);

但是这个循环永远不会用年龄列填充所有数组数据。

2 个答案:

答案 0 :(得分:2)

在sokkyoku的回答中给出了一个有效的解决方案。

读取可变长度行的另一种可能性是使用strtok,如下面的代码片段所示:

int getlines (FILE *fin)
{
    int  nlines = 0;
    int  count  = 0;
    char line[BUFFSIZE]={0};
    char *p;

    if(NULL == fgets(buff, BUFFSIZE, fin))
        return -1;

    while(fgets(line, BUFFSIZE, fin) != NULL) {
        //Remove the '\n' or '\r' character
        line[strcspn(line, "\r\n")] = 0;
        count = 0;
        printf("line[%d] = %s\n", nlines, line);
        for(p = line; (p = strtok(p, " \t")) != NULL; p = NULL) {
            printf("%s ", p);
            ++count;
        }
        printf("\n\n");
        ++nlines;
    }

    return nlines;
}
上述函数getlines

解释

文件fin中的每一行都使用fgets读取并存储在变量line中。 然后通过函数line提取\t中的每个子字符串(由空格或p字符分隔)并将指向该子字符串的指针存储在strtok中for循环(例如,请参阅此post以获取有关strtok的更多示例)。

然后该函数只打印p,但您可以在此处使用子字符串执行所有操作。 我还计算(++count)每行中找到的项目数。最后,函数getline计算并返回读取的行数。

答案 1 :(得分:2)

这永远不会结束的原因是因为你不断提供相同的字符串进行扫描。

sscanf提供了%n开关,用于存储在a内到达之前读取的字符数量,这允许您在重新扫描之前在输入字符串中向前移动该字符数量。

这个工作:

int step[20];
int index=0;
int readLen;
while(sscanf(mystring,"%d%n", &step[index++], &readLen)>0) {
  mystring += readLen;
}