Sscanf是双倍价值

时间:2017-11-12 03:29:37

标签: c double scanf

我需要从字符串中扫描一个双字母,你能帮帮我吗?它必须是这样的:

#include <stdio.h>
#include <string.h>
int main()
{
    const char *key="infinity";
    const char *str = malloc(2*sizeof(double*));
    double a;
    printf("Write the value: "
    scanf("%s",str);
    if (strcmp(str,key)==0)
        printf ("ok");
    else
    {
        sscanf(str,"%lf",&a);
        printf("ok, a is %lf",a);
    }
    return 0;

当我放入无限时,它可以正常工作。但是当我输入一些double值(如1.25)时,它不会。

1.25
ok, a is 0.000000

1 个答案:

答案 0 :(得分:1)

首先,有一种方法可以检查代码行是否成功运行。

您正在使用sscanf(),检查它的返回值,以确定它是否成功完成了它应该做的事情。 (从str获得双倍。

同样为什么const char*。它指向immutable字符串。你无法改变它的价值。所以第一个scanf将失败。您可以在此处使用char*,这足以满足您的要求。

分配2*sizeof(double*)并不能确保您能够保存双号的所有数字。那是个错误的想法。您可以考虑保持粗略值(如小数点后最多12位数),然后扫描它。

考虑malloc的返回值是另一个好习惯。如果失败,则返回NULL。在获得NULL之后,如果继续访问它,则会调用未定义的行为。

无论您使用malloc分配什么,在完成使用后都需要释放它。

还读了一些好书。有很多。

一个小例子:

#include <stdio.h>
#include <string.h>
#include <float.h>
#include <stdlib.h>
#include <ctype.h>
char *trimwhitespace(char *str)
{
  char *end;


  while(isspace((unsigned char)*str)) str++;

  if(*str == 0)
    return str;

  end = str + strlen(str) - 1;
  while(end > str && isspace((unsigned char)*end)) end--;

  *(end+1) = 0;

  return str;
}
int main()
{
    const char *key="infinity";
    char *str = malloc(sizeof(char)*(3 + DBL_MANT_DIG - DBL_MIN_EXP+1));
    if( str == NULL){
        fprintf(stderr,"Error in malloc");
        exit(1);
    }
    char *store = str;
    double a;
    printf("Write the value: ");
    if( fgets(str, (3 + DBL_MANT_DIG - DBL_MIN_EXP+1), stdin) == NULL){           
        fprintf(stderr,"Error in string input");
        exit(1);
    }
    str = trimwhitespace(str);
    if( strlen(str) == 0){
         printf("Empty line detected.\n");
         return EXIT_FAILURE;
    }
    for(size_t i = 1; i < strlen(str); i++){
        if( !isspace(str[i]) && isspace(str[i-1])){
            printf("Error extra input detected\n");
            return EXIT_FAILURE;
        }

    }
    if (strcmp(str,key)==0)
        printf ("ok");
    else
    {
        char *err;

        a = strtod(str, &err);
        if (*err!=0 && !isspace((unsigned char)*err)) { 
            printf("Error extra input detected ");
        }
        else{
            printf("ok, a is %lf",a);
        }

    }
    free(store);
    return 0;
}

参考:

找到一点后,我终于可以引用3 + DBL_MANT_DIG - DBL_MIN_EXP部分的正确引用。请检查 answer