首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用扫描电子显微镜分析字符串

用扫描电子显微镜分析字符串
EN

Stack Overflow用户
提问于 2016-06-08 10:40:53
回答 2查看 340关注 0票数 0

我需要用fget分析前面的字符串阅读器,

然后我有一排:

代码语言:javascript
复制
name age steps\n
mario 10 1 2 3 4\n
joe   15 3 5\n
max   20 9 3 2 4 5\n

每个列都有可变的步骤数,然后我可以用

代码语言:javascript
复制
 sscanf(mystring, "%s %d", name, &age);

在此之后,我有一个用于读取所有步骤的for循环。

代码语言:javascript
复制
   int step[20];
   int index=0;
   while(sscanf(mystring,"%d", &step[index++])>0);

但是,这个周期永远不会结束使用age列填充所有数组数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-08 10:52:14

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

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

这会有用的:

代码语言:javascript
复制
int step[20];
int index=0;
int readLen;
while(sscanf(mystring,"%d%n", &step[index++], &readLen)>0) {
  mystring += readLen;
}
票数 2
EN

Stack Overflow用户

发布于 2016-06-08 10:49:19

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

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

代码语言:javascript
复制
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字符分隔),并通过for循环中的函数strtok将指向该子字符串的指针存储在p中(例如,在strtok上的进一步示例请参见此post )。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37700201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档