【问题标题】:how to: convert the value of a string of char as a double back without atof如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back
【发布时间】: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"的结果?)

标签: c function char double ascii


【解决方案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); 来回答您的问题。你可以查看herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2021-11-05
    • 2016-06-28
    • 2010-11-22
    • 2022-11-10
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多