2015-10-06 138 views
2

是否可以使用sscanf在下面的示例中读取字符串s作为两个10个字符(包括空格)的宽浮点数?或者我必须将10个字符的块复制到临时字符数组,并在该临时数组上使用sscanf用sscanf从char字符串中读取一个固定宽度的浮点数

#include <stdio.h> 
int main(int argc, const char* argv[]) 
{ 
    char s[]={"  6.4887.0522e+06"}; 
    float f1, f2; 

    sscanf(s, "%10f%10f", &f1, &f2); 
    printf("%10f %10f\n", f1, f2); 
} 

我在这个例子中的愿望是从sscanf读得f1 = 6.448f2 = 7052200.

+1

如果我们假设这仅仅是一个例子,并且您希望有一个解析这些数据的通用算法,那么答案就取决于数据格式中的常量。 (例如,点总是4的长度后的数字组?)。一般来说,你可以用字段宽度来停止在一个数字中间,但是@ user3121023表示,空格不计算在内。 –

+0

谢谢,但我显然不够清楚。字符数组应该总是被解析为长度为10个字符的组。所以我的例子中的第一个子字符串是“6.488”,第二个字符串是“7.0522e + 06”。问题不在于只读取这个特定的字符串。我正在寻找一种通用的方法来读取这种类型的数据,其中每个10字符的子字符串可以包含以有效浮点格式格式化的任何种类的浮点值。 – Anders

+0

你可以拆分数组:https://ideone.com/CGgtUj – mch

回答

1

扫描集可能工作。将有效字符放在括号中。 10将扫描限制为10个字符。 %n说明符将报告扫描处理的字符数。这可以在sscanf中用于遍历一个长字符串。

char substr[11] = {'\0'}; 
char s[]={"  6.4887.0522e+06"}; 
int offset = 0; 
int used = 0; 

while ((sscanf (s + offset, "%10[-+.eE 0-9]%n", substr, &used)) == 1) { 
    if (used == 10) { 
     printf ("%s\n", substr); 
     //convert as needed 
     offset += used; 
    } 
    else { 
     //do something to handle the problem 
     break;//one option... 
    } 
} 
+0

这是sscanf格式的一些非常漂亮的用法。我接受这个答案,并感谢你花在我的问题上的时间。谢谢! – Anders

2

如果s[]const,暂时使s[10] = 0

void foo(char *s) { 
    while (*s) { 
    size_t length = strlen(s); 
    char temp = 0; 
    if (length > 10) { 
     length = 10; 
     temp = s[10]; 
     s[10] = 0; 
    } 
    float f1; 
    if (sscanf(s, "%f", &f1) == 1) printf("%f\n", f1); 
    s += length; 
    s[0] = temp; 
    } 
} 
+0

这也是一个很好的答案。我有点惊讶,但没有选择让sscanf在最大字段宽度参数中包含前导空格。我看不出如何丢弃前导空白比不丢弃它们更有用。如果包含这些空白区域,则读取固定字段宽度的数据格式将是一行代码。 – Anders

+0

@Anders'scanf()'是为空白量无关的数据设计的。 IAC,简单地将10 char'复制到缓冲区中,附加一个空字符然后解析似乎很简单。 – chux