当前位置: 首页 > 知识库问答 >
问题:

字符串长度有限的strod

尹小云
2023-03-14

如果我想将char数组中的前3个字符作为双精度字符进行解析,而忽略以下字符,那么我真的需要这样做吗?

int main() {
    const char a[] = "1.23";
    char *b = malloc(sizeof(char) * 4);

    memcpy(b, a, sizeof(char) * 3);
    b[3] = '\0';

    printf("%f\n", strtod(b, NULL)); // Prints 1.20000, which is what I want

    free(b);
}

难道没有一个像strtod这样的函数允许您指定它应该搜索的数字的最大字符串长度吗?

编辑:我希望它打印1.2(它目前这样做),而不是1.23

共有3个答案

穆宾白
2023-03-14

strtod的签名如下

   double strtod(const char *nptr, char **endptr);

该函数将返回由nptr指向的字符串的初始部分。如果endptr不是NULL,则指向转换中使用的最后一个字符后的字符的指针将存储endptr引用的位置。

因此,它不允许您指定需要转换的字符数。因此,您必须修改您的输入本身,并将其传递给strtod。

汝承载
2023-03-14

如果您总是希望只考虑给定字符串中的三个第一个字符,则可以使用以下代码

#include <stdio.h>
#include <string.h>

double parse_double(const char *str) {
  char *tmp = 0;
  double result = 0;

  asprintf(&tmp, "%.3s", str);
  result = strtod(tmp, 0);
  free(tmp);

  return result;
}

int main(void) {
  printf("%f\n", parse_double("1.23")); // 1.2
  printf("%f\n", parse_double("1234")); // 123
  printf("%f\n", parse_double("0.09")); // 0.0

  return 0;
}
杨超
2023-03-14

虽然strtod()不允许您限制字符串长度,但您可以使用具有最大字段宽度的sscanf(),并可选检查所使用的字符数,如下所示:

#include <stdio.h>

double parseDouble(const char *str){
    double val = 0;
    int numCharsRead;

    // Handle errors by setting or returning an error flag.
    if(sscanf(str, "%3lf%n", &val, &numCharsRead) != 1){
        puts("Failed to parse double!");
    }
    else if(numCharsRead != 3){
        puts("Read less than three characters!");
    }

    return val;
}

int main(){
    printf("%lf\n", parseDouble("1.3")); // 1.300000
    printf("%lf\n", parseDouble("1.5999")); // 1.500000
    printf("%lf\n", parseDouble(".391")); // 0.390000
    printf("%lf\n", parseDouble(".3")); // Read less than three characters!\n0.300000
    return 0;
}

sscanf(str,"%3lf%n",

指定最大字段宽度的可选十进制整数。当达到此最大值或找到不匹配的字符时(以先发生的为准),将停止读取字符。大多数转换都会丢弃初始空白字符(以下列出了例外情况),这些被丢弃的字符不会计入最大字段宽度。字符串输入转换存储一个终止的空字节('\0'),以标记输入的结束;最大字段宽度不包括此终止符。

 类似资料:
  • 问题内容: 我正在寻找一种方法来限制php中的字符串,并在字符串过长时在末尾添加…。 问题答案: 您可以使用类似于以下内容的东西:

  • 问题内容: 我有以下几点: 有没有一种方法可以将字符串的长度限制为20个字符? 还有一个更好的问题是,如果超过20个字符,有没有办法我可以将字符串更改为截断并显示在末尾? 问题答案: 编辑 最新版本的报价过滤器。 您需要这样的 自定义过滤器 : 用法: 选项: 逐字(布尔)-如果为true,则仅按字数限制切入, max(整数)-文本的最大长度,切成此字符数, tail(字符串,默认值:“…”)-如

  • 本文向大家介绍jQuery 限制输入字符串长度,包括了jQuery 限制输入字符串长度的使用技巧和注意事项,需要的朋友参考一下 我们后台做程序的时候,比如录入一篇文章,文章会有摘要,我们希望文章的字符长度是我们可以控制的,我们不希望它太长,比如限制只能输入250个字符,下面的代码实现了这种功能。 先来看一下效果图 代码如下: 以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持呐喊教程

  • 我正在尝试使用pycrypto加密我的数据。我已经为此编写了以下代码。 但我的错误率越来越低 如何控制输入字符串?输入字符串可以是任意长度。

  • 要求出字符串的长度(字符的个数),我们可以使用length函数。调用这个函数的语法和我们前面看到的有点不同: int length; length = fruit.length(); 对于这种函数调用,我们称之为在字符串变量fruit上**调用(invoke)**length函数。“调用(invoke)”这个词可能看起来有点奇怪,但是后面我们还会遇到很多在对象上调用函数的例子。 函数调用的语法称

  • 所以我们有一个例子,我们会有一个对象,其中key是id(int),值是字符串。但我们注意到,大多数时候,我们根据字符串查找id,所以我们决定将其反转并使字符串成为key,值是id。因为这样就不用遍历每个项目并比较值,我们可以只执行。下面是我们所做的示例。 下面是旧实现的示例: 以下是新实现的示例: 我知道现在字符串是键,可以为相同的字符串获取相同的id。但是现在这个字符串可能非常大(可能性很小,但