在C中使用具有多个输入值的atof()函数

时间:2015-02-09 19:42:18

标签: c windows codeblocks

该程序的目标是创建一个函数,该函数读取单个字符串,用户键入的命令(最终用于与机器人一起使用的程序),该命令由未知的命令字组成(存储和打印为命令),以及未知数量的十进制参数(数量存储并打印为num,参数将作为浮点值存储在数组参数中)。在用户输入中,命令和参数将以空格分隔。我相信我的问题是当我从字符串中提取十进制值时使用atof函数。我究竟做错了什么?谢谢你的帮助!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(char *input, char *command, int *num, float *params);

int main()
{
    char input[40]={};
    char command[40]={};
    int num;
    float params[10];

    printf("Please enter your command: ");
    gets(input);

    func(input,command,&num,params);

    printf("\n\nInput: %s",input);
    printf("\nCommand: %s",command);
    printf("\n# of parameters: %d",num);
    printf("\nParameters: %f\n\n",params);

    return 0;
}

void func(char *input, char *command, int *num, float *params)
{
    int i=0, k=0, j=0, l=0;
    int n=0;
    while(input[i]!=32)
    {
        command[i]=input[i];
        i++;
    }
    for (k=0; k<40;k++)
    {
        if ((input[k]==32)&&(input[k-1]!=32))
        {
            n++;
        }
    }
    *num=n;

    while (j<n)
    {
        for (l=0;l<40;l++)
        {
            if((input[l-1]==32)&&(input[l]!=32))
            {
                params[j]=atof(input[l]);
                j++;
            }
        }
    }
}

示例输出屏幕:

Please enter your command: Move 10 -10

Input: Move 10 -10
Command: Move
# of parameters: 2
Parameters: 0.000000

理想情况下,参数输出应为输出“10 -10”。谢谢!

3 个答案:

答案 0 :(得分:1)

atof(input[l])更改为atof(input + l)input[l]是单个字符,但您想从l位置获取子字符串。另请参见strtod()函数。

答案 1 :(得分:1)

其他人已在您的代码中注明了该问题,但我建议您改为查看strtod()吗?

虽然atof() strtod()在您开始时都会丢弃空格(因此您不需要手动执行此操作),strtod()将指向数字的末尾,以便您知道继续的位置:

while(j < MAX_PARAMS) // avoid a buffer overflow via this check
{
    params[j] = strtod(ptr, &end); // `end` is where your number ends
    if(ptr == end) // if end == ptr, input wasn't a number (say, if there are none left)
        break;
    // input was a number, so ...
    ptr = end; // continue at end for next iteration
    j++; // increment number of params
}

请注意,上述解决方案无法区分无效参数(例如foo而不是3.5)和缺失参数(因为我们已经击中了最后一个参数)。您可以通过执行以下操作来检查:if(!str[strspn(str, " \t\v\r\n\f")]) ---这将检查我们是否在字符串末尾(但允许尾随空格)。请参阅第二个附注,了解它的作用。


<强> SIDE-NOTES:

  • 您可以使用' '代替32来检查空间;这有两个好处:

    1. 对读者来说更清楚(很清楚它是一个空白,而不是&#34;一些具有意义的神奇数字&#34;)
    2. 它适用于非ASCII编码(标准允许其他编码,尽管ASCII是目前最流行的;一种常见的编码是EBCDIC)
  • 为了将来参考,这个技巧可以帮助您跳过空白:ptr += strspn(ptr, " \t\v\r\n\f");strspn返回字符串开头的匹配集合的字符数(在本例中为" \t\v\r\n"之一)。查看文档以获取更多信息。

strspn的示例:strspn("abbcbaa", "ab");返回3,因为您aab之前c(匹配)(不是){<1}}。 / p>

答案 2 :(得分:0)

您正尝试将char转换为float

params[j]=atof(input[l]);

你应该得到浮点数的整个单词(子串)。

示例,"12.01"一个包含5个字符的空终止字符串,并将其传递给atofatof("12.01"),它将返回double 12.01

所以,你应该首先为每个float参数提取字符串并将其传递给atof

避免将字符与ascii值进行比较,而是直接使用' '(空格)。

您可以使用strlen()strnlen()来查找输入字符串的长度,而不是使用具有固定大小的for循环。