如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back
Posted
技术标签:
【中文标题】如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back【英文标题】:how to: convert the value of a string of char as a double back without atof 【发布时间】:2022-01-08 07:11:25 【问题描述】:我被函数 double ascii_to_float 卡住了。我的函数应该接收一个 char 字符串并将其值作为双回。我不允许使用 atof()。
我想在字符串中搜索一个点,以证明它是否为双精度。如果不是,它应该返回 -1。
double ascii_to_float(char *textzahl)
int x;
double ausgabe;
sprintf(ausgabe,"%s",textzahl);
/* here with -=48, i´m not sure how to code
it right, i just now that i have to decrease with 48.*/
for(x=0; x< strlen(textzahl); x++)
if(textzahl[x]=='.')
textzahl[x]-=48;
else
textzahl[x]=-1;
return ausgabe;
main函数已经给出,所以我只需要写上面函数的代码。
#include <stdio.h>
#include <string.h>
int main()
char text[80];
double zahl2;
printf("\n bitte eine Zahl eingeben:"),
fgets(text, sizeof(text), stdin);
zahl2= ascii_to_float ( text);
if (zahl2==-1.0)
printf("\nfehlerhafte Eingabe oder Wert -1");
else
printf("\ndie Zahl2 lautet: %lf\n",zahl2);
【问题讨论】:
首先请尽量避免使用magic numbers)。如果值48
表示'0'
的ASCII 代码,那么最好使用'0'
,因为它更清晰,并且对于不使用ASCII 的其他平台也可移植。
另外,请养成打印trailing换行符的习惯。当stdout
(printf
写入)连接到实际终端时,它的 行缓冲,这意味着输出实际上是在换行符上写入终端。所以如果你打印一个前导换行符,那么你写的是 previous 行,而不是当前行。尾随换行符还将确保最后一个输出不会与终端提示混合。
你的作业的实际文本是什么?请edit您的问题包括完整和完整的作业文本,包括任何和所有要求和限制。还有其他几种方法可以使用标准 C 函数将字符串转换为 float
,如果限制仅提及 atof
,那么您可以在其中一个函数中挑剔。
Start simple。你知道如何编写类似atoi()
的代码吗?
如果字符串不包含小数点,作业是否告诉您返回 -1?如果不是,我不会那样做。将字符串"123"
转换为double
值123.0
是完全有效的。 (另外,如果你在错误时返回-1,你怎么知道它是一个实际的错误,还是转换字符串"-1.0"
的结果?)
【参考方案1】:
我没有遵循您的术语意味着变量、函数的名称......因为这对我来说很耗时。
代码
#include<stdio.h>
#include<string.h>
double fun(char*);
int main()
char str1[]="2356.23", str2[]="234", str3[]="bonap.art" ,str4[]="33.42.2";
printf("%lf, %lf, %lf, %lf", fun(str1),fun(str2),fun(str3),fun(str4));
double fun(char *s)
int count=0;
int i;
for(i=0; i<=strlen(s)-1; i++)
if(s[i]=='.')
count++;
if(count==2)
return -1;
if( !((s[i]>=48 && s[i]<=57)|| (s[i]=='.')) )
return -1;
if(count==0)
return -1;
double d;
sscanf(s,"%lf",&d);
return d;
输出
2356.230000, -1.000000, -1.000000, -1.000000
如果你仔细看代码,你就会明白一切。我还是解释了一些事情。
您提到要检查给定的字符串是否为双倍,您正在检查.
它是否包含点,但这还不够。
如果字符串包含 2 个.
(点)或a
、b
、*
、...等字符怎么办?所以为了解决这两个问题,我添加了count
、!((s[i]>=48 && s[i]<=57)|| (s[i]=='.'))
这些条件分别。不明白的我就不细说了,大家可以评论。
我不明白你为什么选择sprintf(ausgabe,"%s",textzahl);
而不是sscanf(s,"%lf",&d);
您也可以考虑strtod
float strtod (const char* str, char** endptr);
来回答您的问题。你可以查看here和here
【讨论】:
以上是关于如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 InterfaceBuilder 的情况下将 UISwitch(切换开关)添加到 UIToolBar
如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?