繁体   English   中英

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

[英]Can I use fscanf to get only digits from text that contain chars and ints?

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

例如:

+ 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 ,它将获得它找到的第一位数,但我错了。 如果有的话,我愿意采取更好的方法。

建议不要使用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 */
  }
  ...
}
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) { ... } 

根据您认为更有可能的情况,可以颠倒这两个fscanf()策略的顺序。 使用scanf()系列函数时,如果数字字符串太长而导致数字不能用int表示,则总是存在问题; 您会得到不确定的行为。 我不会尝试解决这个问题。

这将在每行获取多个数字,每次调用获取一个。 如果您希望每行有一个数字,或者希望控制每行的处理方式,请使用fgets()readline()读取行,然后使用sscanf()进行分析。 这样的一个好处是,如果您选择这样做,则可以使用细心的函数(例如strtol()将数字转换为数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM