该程序的目标是创建一个函数,该函数读取单个字符串,用户键入的命令(最终用于与机器人一起使用的程序),该命令由未知的命令字组成(存储和打印为命令),以及未知数量的十进制参数(数量存储并打印为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”。谢谢!
答案 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
来检查空间;这有两个好处:
为了将来参考,这个技巧可以帮助您跳过空白: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个字符的空终止字符串,并将其传递给atof
,atof("12.01")
,它将返回double
12.01
。
所以,你应该首先为每个float参数提取字符串并将其传递给atof
避免将字符与ascii值进行比较,而是直接使用' '
(空格)。
您可以使用strlen()
或strnlen()
来查找输入字符串的长度,而不是使用具有固定大小的for循环。