我可以使用fscanf只获取包含字符和整数的文本中的数字吗?

时间:2013-10-16 20:47:51

标签: c scanf

我想从包含字符和数字的文件中提取数字。

例如:

+ 321 chris polanco 23

我想跳过'+'并只获得321.

这是我到目前为止的代码。

while(fscanf(update, "%d", &currentIn->userid) != EOF){
    currentIn->index = index;
    rootIn = sort(rootIn, currentIn);
    index = index + 1;
    currentIn = malloc(sizeof(Index));
}

我在想,因为我有%d它会得到它找到的第一个数字,但我错了。如果你们有任何人,我愿意接受更好的方法。

2 个答案:

答案 0 :(得分:2)

我建议使用fgets() + sscanf()组合来处理每一行,而不是与fscanf()挣扎(并在以后遇到格式问题)。

如果您知道您感兴趣的整数从文件的每一行的第3个位置开始,那么您可以在sscanf()中执行line+2来读取它。否则,您可以根据输入文件的格式修改sscanf()格式字符串。

char line[MAX_LINE_LEN + 1];

While ( fgets(line, sizeof line, update) )
{
  if(sscanf(line+2, "%d",  &currentIn->userid) != 1)
  {
   /* handle failure */
  }
  ...
}

答案 1 :(得分:0)

while (fscanf(update, "%*[^0-9]%d", &currentIn->userid) == 1)
{
    ...
}

这会跳过非数字(即%*[^0-9]部分)后跟一个整数。抑制的分配不计算在内,因此== 1可确保您获得一个号码。

不幸的是,如果文件中的第一个字符是数字,则会遇到问题 - 正如Chris Dodd所指出的那样。有多种可能的解决方案:

  1. ungetc('a', update);将首先读取非数字。
  2. while ((fscanf(update, "%*[^0-9]"), fscanf(update, "%d", &currentIn->userid)) == 1)
  3. 或者:

    while (fscanf(update, "%*[^0-9]%d", &currentIn->userid) == 1 ||
           fscanf(update, "%d", &currentIn->userid) == 1)
    {
        ...
    }
    
  4. 根据您认为更有可能的情况,您可以撤消这两个fscanf()政策的顺序。使用scanf()函数族,如果数字字符串太长以至于数字无法在int中表示,则总会出现问题。你得到未定义的行为。我不打算解决这个问题。

    这将为每行拾取多个数字,每次调用一个。如果您希望每行有一个数字,或者想要控制每行的处理方式,请使用fgets()readline()来读取该行,然后使用sscanf()进行分析。这样做的一个优点是,如果您这样选择,您可以使用strtol()之类的细致函数将数字转换为数字。