gpt4 book ai didi

c - 将字符串转换为数字

转载 作者:行者123 更新时间:2023-11-30 15:40:12 24 4
gpt4 key购买 nike

我正在寻找一种方法来获取字符串并检查 3 种可能性。

  • 数字,从而将其转换为有符号 int(不是 long)
  • 是之前在运行时定义的符号表示,并将其转换为有符号整型
  • 都不是

“符号表示”基本上就像一个关联数组,从 0 个元素开始,并随着添加更多符号而扩展。例如,假设 C 有关联数组(我希望)与此 peusdocode:

symbol_array['q'] = 3;
symbol_array['five'] = 5;
symbol_array['negfive'] = -5;
symbol_array['random294'] = 28;

signed int i;
string = get_from_input();
if(!(i = convert_to_int(string))) {
if(!(i = translate_from_symbol(string))) {
printf("Invalid symbol or integer\n");
exit(1);
}
}

printf("Your number: %d\n, i);

这个想法是,如果他们输入“5”,它会通过convert_to_int将其转换为5,如果他们输入“5”,它会通过translate_from_symbol将其转换为5。我觉得最难的是,如果他们输入“random294”,它不会将其转换为 294,而是转换为 28。如果他们输入“foo”,那么它将退出(1)。

我的一般问题是:(而不是发表多个帖子)

当制作convert_to_int时,我知道我不应该使用atoi,因为它不会正确失败。有人说使用 strtol 但将其转换回非长整型似乎很乏味。我发现的最简单(读:最短)的方法是使用 sscanf:

int i;
if ((sscanf(string, "%d", &i)) == 1){
return i;
}

然而,有些人甚至看不起这一点。如果不是 sscanf 或转换 strtol,还有什么更好的方法?

其次,我怎样才能不仅返回一个整数,而且知道它是否找到一个整数。例如,如果用户输入“0”,那么它将返回 0,从而在 if 语句中触发 FALSE。我曾考虑过如果找不到则使用 -1,但由于我返回的是带符号的 int,所以这也遇到了同样的问题。在 PHP 中,我知道例如 strpos 他们使用 === FALSE

最后,是否有任何简短的代码可以模拟关联数组和/或让我在运行时将元素推送到数组?

最佳答案

首先,您可能需要修改语法并将关键字与操作数分开,即 "neg Five" 而不是 "neg Five"。否则,关键字的符号查找必须考虑每个前缀。 (如果您的关键字不允许包含数字,则“random294”可能没问题。)

当然,sscanf 会告诉您是否在返回值中找到了小数,并将该小数写入单独的 int,这很好,但您必须通过检查读取的字符数是否等于 %n 格式的字符串长度来留意尾随字符。否则,sscanf 会将 5x 视为合法的十进制数。 strtol 还返回一个指向解析后的十进制数后面位置的指针,但根据我的口味,它过于依赖于检查 err

事实上,strtol 使用长整数应该不是问题。如果输入不适合 int,则返回 INT_MAXINT_MIN 或发出错误。

您还可以轻松地围绕 sscanfstrtol 编写更适合您需求的包装函数。 (我知道我想要一个在成功时返回 true 并通过指针参数存储整数的函数,sscanf 样式,其中成功意味着:没有尾随非数字字符。)

最后,关于关联数组:没有短代码,至少在 C 中没有。您必须实现自己的 HashMap 或使用库。作为初稿,我将使用线性字符串列表并逐一检查它们。这是一个非常幼稚的方法,但很容易实现。我假设您一开始并没有使用大量符号,并且没有进行大量检查,因此速度不应该成为问题。 (您可以对数组进行排序并使用二分搜索来加快速度,但每次插入后都必须重新排序。)一旦您的程序逻辑正常工作,您就可以开始考虑 HashMap 了。

关于c - 将字符串转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21129079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com