【问题标题】:Using fscanf() to skip a string使用 fscanf() 跳过字符串
【发布时间】:2014-12-19 03:04:49
【问题描述】:

输入文件是这样的,它在第一行有一个字符串,后跟一个整数,从第二行开始,它有一个字符串,后跟 2 个整数。我下面的代码运行良好,但有没有办法跳过字符串?我只是用一些字符数组 char sink[30] 扫描它。实际上我不需要这个值我怎么能使用 fscanf() 来跳过这个字符串并只读取整数。

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int v,i=0,f=1;
    static int *p,*q;
    FILE *fp;
    char sink[30];
    fp = fopen("some.txt","r");

    while(!feof(fp))
    {   
        if(f)
        {   
            fscanf(fp,"%s %d",sink,&v);
            p = (int *)malloc(sizeof(int)*v);
            q = (int *)malloc(sizeof(int)*v);
            f=0;
        }   
        else
        {   
            fscanf(fp,"%s %d %d",sink,&p[i],&q[i]);
            i++;
        }   
    }   

    fclose(fp);

    printf("The input vertices are\n");
    for(i=0;i<v;i++)
        printf("%d %d\n",p[i],q[i]);
    return 0;
}

【问题讨论】:

  • 如果您的数据按预期格式化,fscanf(fp,"%*s %d",&amp;v); 工作得很好。如果您的输入格式不正确,它确实不会揭示问题。 "%s""%d" 导致 scanf() 系列跳过前导空格,因此现在代码失去了区分 ' ''\n' 的能力。要读取“... on first line”,建议先读取该行,可能使用@unwind 建议的fgets(),然后扫描生成的缓冲区。
  • @chux 我对 fgets() 的理解是它需要一些预定义的缓冲区吗?使用它不是一个问题吗?同样在执行 fgets() 之后我们需要执行 sscanf() 对吗?
  • fgets() 需要一个预定义的缓冲区。缓冲区不需要过长,因为重复调用可以处理过长的初始“字符串”。或使用fgetc()。 IAC,不是一个大问题。 sscanf() 是一种扫描缓冲区的方法,strtol()strtok() 或简单的代码可以解析缓冲区。它归结为输入错误检测要求。使用此代码建议至少进行简单测试:在使用扫描值之前检查来自fscanf() 的返回值。确保v 像 (0 feof(fp) 的用法是错误的。检查fscanf() 的返回值,如果i==v 则退出循环。
  • 您可以对所有读数使用相同的 fscanf() 调用。然后,在调用检查以确保 facanf() 的返回值为 2 之后,则不会读取第二个字符串参数,如果为 3,则读取两个字符串参数。然后,采取相应的行动。

标签: c


【解决方案1】:

如果您的输入是面向行的,那么使用面向行的输入要好得多。比如fgets(),它可以让你阅读整行。当然,跟踪读取的行是否是第一行非常容易。

还有:

【讨论】:

  • 有趣的阅读!我总是使用我的 malloc() 进行转换,所以即使在将内存分配给 struct 或任何其他数据类型时也不需要转换 malloc 吗?我以前只是做 malloc,但后来我开始铸造,因为我看到很多人这样做
  • 您永远不需要强制转换以将 void * 转换为 C 中的任何其他(非函数)指针。所以不要。
【解决方案2】:

要丢弃 scanf 中的数据,请在格式说明符之间使用星号,例如 %*s%*c 等。这与 fscanf 相同。只需添加一个星号即可扫描并丢弃字符串:

fscanf(fp,"%*s %d",&v);

这将从文件中扫描一个字符串,将其丢弃,然后扫描并将一个整数分配给v。你可以为你的第二个fscanf做同样的事情:

fscanf(fp,"%*s %d %d",&p[i],&q[i]);

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2012-10-14
    • 2018-03-21
    相关资源
    最近更新 更多