C语言中,请问如何从字符串中读取所有的浮点数(个数不知道),浮点数以空格隔开

假设有一个字符串str="1.02.03.0...(N个)",有没有什么函数可以读取这些浮点数到一个数组里,并统计浮点数个数。之前看sscanf似乎比较接近,但是它要求格... 假设有一个字符串str="1.0 2.0 3.0...(N个)",有没有什么函数可以读取这些浮点数到一个数组里,并统计浮点数个数。
之前看sscanf似乎比较接近,但是它要求格式控制符中需要确定浮点的个数,似乎不能适应这种个数不定的用法。
展开
 我来答
匿名用户
2014-03-26
展开全部

  如果确认字符串中只有空格分开的浮点数的话,可以利用一个缓存字符串数组, 临时保存当前字符到下一个空格之间的字符, 然后利用atof把它转换为浮点数,然后清空缓存字符串数组,继续读取,直到字符串尾


#include <stdlib.h>
#include <stdio.h>
#define FLOAT_ARRAY_LENGTH 100
#define BUFFER_LENGTH 30
void clear(char buffer[],int len) {
 int i = 0;
 for (; i < len; i++) {
  buffer[i]='\0';
 }
}
int main()
{
  float f[FLOAT_ARRAY_LENGTH];/*保存识别出的浮点数,数组大小=?*/
  int count=0;
  char buffer[BUFFER_LENGTH]; /*保存当前字符到下一个空格间的字符*/
  char prevChar=' ';    /*保存当前字符前一个字符,以处理连续多个空格的情况*/
  int j=0;
  char *test = " 12345.67 0.1 1.0   .0 ";/*应该输出4个浮点数*/
  for(int i=0;test[i]!='\0';i++){
   if(test[i]!=' '){
    buffer[j]=test[i];
    prevChar=test[i];
    j++;
   } else if(prevChar!=' '){
    f[count]=atof(buffer);
    ++count;
    clear(buffer,BUFFER_LENGTH);
    prevChar=' ';
    j=0;
   }/*如果有连续多个空格,则后面的空格无需处理,跳过即可*/
  }
  for (int i = 0; i < count; i++) {
    printf("<%d>     %15.3f\n", i, f[i]);
  }
  return 0;
}

  

kaixingui2012
2014-03-26 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6418万
展开全部
用sscanf确实可以实现,代码如下:
#include <stdio.h>
int main()
{
char *str="1.0 2.0 3.0 4.0 50.0" ;
int i ;
double d ;
i=0;

while( *str == ' ' ) str++ ;
while( sscanf( str, "%lf" , &d )==1 )
{
while( *str != ' ' ) str++ ; //跳过已读过的数
i++;
printf( "d:%03d= %lf\n" , i , d );
while( *str == ' ' ) str++ ; //跳过分格符:空格
}
printf( "there is(are) %d float num(s) in str\n" , i );
return 0;
}
当然,你也可以用strtok()函数过获取数据,细节可参看相应的函数介绍
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2014-03-27 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6615万
展开全部
//#include "stdafx.h"//vc++6.0加上这一行.
#include <iostream>
#include "iomanip"
using namespace std;
void main(void){
char *str=",1.3 2.1, 3.0 5.0 6.0 7.0 8.0 9.0 ",ch;
int i=0,j=0;
double doub[20];
for(j=i=0;str[i];i++){
if(((ch=str[i])>'9' || ch<'0') && ch!='.') continue;
sscanf(str+i,"%lf",doub+j++);
while((ch=str[i])<='9' && ch>='0' && ch!='\0' || ch=='.') i++;
}
for(i=0;i<j;cout << doub[i++] << ' ');
cout << endl;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-03-26
展开全部
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void main()
{
int i,j,n=0,len;
float a[50];
char *str="1.2 2.5 100 23.8 63",str1[10];

len=strlen(str);
j=0;
for(i=0;i<len;i++)
{
if(str[i]!=' ')
str1[j++]=str[i];
else
{
str1[j]=0;
if(j>0)
{
a[n++]=atof(str1);
}
j=0;
}
}
if(j>0)
{
str1[j]=0;
a[n++]=atof(str1);
}
for(i=0;i<n;i++)
printf("%g ",a[i]);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式