使用sscanf从char字符串中读取固定宽度的float

时间:2015-10-06 09:26:58

标签: c scanf

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

#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);
}

我希望在此示例中从f1 = 6.448读取f2 = 7052200.sscanf

2 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分: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...
    }
}