如何:在不使用 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换行符的习惯。当stdoutprintf 写入)连接到实际终端时,它的 行缓冲,这意味着输出实际上是在换行符上写入终端。所以如果你打印一个前导换行符,那么你写的是 previous 行,而不是当前行。尾随换行符还将确保最后一个输出不会与终端提示混合。 你的作业的实际文本是什么?请edit您的问题包括完整和完整的作业文本,包括任何和所有要求和限制。还有其他几种方法可以使用标准 C 函数将字符串转换为 float,如果限制仅提及 atof,那么您可以在其中一个函数中挑剔。 Start simple。你知道如何编写类似atoi() 的代码吗? 如果字符串不包含小数点,作业是否告诉您返回 -1?如果不是,我不会那样做。将字符串"123" 转换为double123.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 个.(点)或ab*、...等字符怎么办?所以为了解决这两个问题,我添加了count!((s[i]&gt;=48 &amp;&amp; s[i]&lt;=57)|| (s[i]=='.'))这些条件分别。不明白的我就不细说了,大家可以评论。

我不明白你为什么选择sprintf(ausgabe,"%s",textzahl);而不是sscanf(s,"%lf",&amp;d);

您也可以考虑strtod float strtod (const char* str, char** endptr); 来回答您的问题。你可以查看here和here

【讨论】:

以上是关于如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back的主要内容,如果未能解决你的问题,请参考以下文章

如何在不在C#中移动光标的情况下将char输出到控制台?

如何在不使用 InterfaceBuilder 的情况下将 UISwitch(切换开关)添加到 UIToolBar

如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?

如何在不使用 ToString() 的情况下将 Int 转换为 C# 中的字符串?

如何在不使用 span 标签的情况下将颜色赋予 *

如何在不使用 BIOS 的情况下将数据写入显卡?