我有一个非常简单的问题。 (使用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
答案 0 :(得分:2)
我认为这样做的方法是将strpbrk
与strtol
合并。
看起来有点像:
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;
}