在一个句子中的字母之间扫描数字

时间:2010-05-11 18:20:09

标签: c file scanf

我有一个非常简单的问题。 (使用C)

在诸如

之类的句子中

In this document, there are 345 words and 6 figures

如何在忽略介于两者之间的所有内容的情况下扫描345和6?

我试过fscanf(FILE *pointer,"%d %d",&words,&figs); 但它只获得第一个价值......

我做错了什么?

修改

对不起,我忘了提,声明总是固定的...... In this document, there are # words and # figures

5 个答案:

答案 0 :(得分:2)

我认为这样做的方法是将strpbrkstrtol合并。

看起来有点像:

long int n;
const char *p = str;
while( (p = strpbrk(p, "-0123456789")) ) {
    n = strtol(p, &p, 0);
    handle(n);
}

更新:
根据您的需要,使用strtol(p, &p, 10)可能更好,因为在我刚刚运行的测试中,我发现它确实将Testing0x100what happens if I use base16 hex转换为256, 16

答案 1 :(得分:2)

格式字符串的问题在于格式字符串中的空格只会导致忽略空格。

如果在下一个换行符之前可能没有第二个数值,我认为只使用scanf()可以做到这一点,而且你也容易受到任意输入长度的影响。但fgets() / sscanf()组合应该可以正常使用:

int a=0, b=0;
char buf[255];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%*[^0-9]%d%*[^0-9]%d", &a, &b);

但是,如果您知道总是有两个单独的数值并且输入长度固定为合理的长度,则应执行以下操作:

int a=0, b=0;
scanf("%*[^0-9]%d%*[^0-9]%d", &a, &b);

答案 2 :(得分:2)

这是因为scanf()系列的函数用于读取使用printf()类似函数编写的字符串,格式相同。既然是这里的情况,就不需要求解字符串解析和转换为整数:

const char *format = "In this document, there are %d words and %d figures";

int n = fscanf(fp, format, &words, &figs);
if (n != 2) //--- not recognized ...

当然,格式必须完全相同,至少在读取的值之前,因此在一次且仅一次之后将其保存在一个位置更安全原则,是测试fscanf()返回码所必需的。

答案 3 :(得分:1)

如果您不知道输入字符串的确切格式,我认为scanf / fscanf不会执行您需要的操作。

更好的方法可能是解析输入行,直到您点击空格,句点或逗号(或其他一些分隔符),然后查看到目前为止您所拥有的内容是否只包含数字。如果是这样,那么你有一个数字,否则,你有一个单词(假设这里的句子形式很好)。然后,您可以将该数字存储在数组或您想要的任何数据结构中。

但是,如果句子结构的格式完全相同,则可以使用如下方法:

    int main() {
      char* buff = "In this document, there are 345 words and 6 figures";
      char extra1[5000];
      char extra2[5000];
      int a,b;
      sscanf(buff,"%[In this document, there are ]%d%[ words and ]%d", extra1, &a, extra2, &b);
      cout<<a<<" "<<b<<endl;
      return 0;
    }

答案 4 :(得分:1)

您需要对字符串进行标记并按顺序检查每个单词。以下代码是从a C++ reference修改的,调用实际上是C。

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample 9876 string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    if (pch[0] >= '0' && pch[0] <= '9')
    {
        // It's a number
    }
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}