C++ 将字符类型转换为 int 类型

如何解决C++ 将字符类型转换为 int 类型

所以我阅读并被教导从我的给定字符中减去 '0' 将它变成一个 int,但是我的 Visual Studio 没有识别出这里,说“const char*”类型的值不能用于初始化此处为 C++ 编程中的 int 类型实体。

bigint::bigint(const char* number) : bigint() {


int number1 = number - '0'; // error code
for (int i = 0; number1 != 0 ; ++i)
{
    digits[i] = number1 % 10;
    number1 /= 10;
    digits[i] = number1;
}
}

前半部分的目标是简单地将给定的数字转换为 int 类型。后半部分向后输出该数字,没有前导零。请注意,此函数是此处头文件中声明的类的一部分:

 class bigint {
    
    public:
      static const int MAX_DIGITS = 50;
    
    private:
      int digits[MAX_DIGITS];
    
    public:
    
      // constructors
      bigint();
      bigint(int number);
      bigint(const char * number);
}
  

有什么方法可以将 char 参数转换为 int 以便我可以输出一个 int?不使用 std 库或 strlen,因为我知道有一种方法可以使用“0”字符,但我似乎做对了。

解决方法

您可以通过减去 '0'..'9'0..9 范围内的单个字符变成单个数字 '0',但不能将 字符串通过减去 '0' 将字符转化为一个数字。您需要一个像 std::stoi() 这样的解析函数来逐个字符地进行转换工作。

但这不是您在这里需要的。如果将字符串转换为数字,则必须将数字分开。字符串已经是碎片了,所以:

bigint::bigint(const char* number) : bigint() {
    while (number) // keep looping until we hit the string's null terminator
    {
        digits[i] = number - '0'; // store the digit for the current character
        number++; // advance the string to the next character
    }
}

更高级的版本可能需要一些额外的工作,例如适当调整 digits 的大小以适应 number 中的位数。目前我们无法知道 digits 中实际使用了多少个槽,这将导致稍后程序必须找出停止读取数字的位置时出现问题。

,

我不知道你的理解是什么,所以我会复习我在代码片段中看到的所有内容。

首先,您传递给函数的是一个指向字符的指针,如果您愿意,可以使用 const 关键字使 char 不可变或“只读” .

A char 实际上是一个 8 位大小的 1 整数。它可以以二进制形式存储数值,也可以解释为字符。

Fundamental types - cppreference.com

Standard 还期望 char 是“字符表示类型”。它可以用 ASCII 代码表示,但也可能是 EBCDIC 之类的其他东西,我不确定。为了将来参考,请记住不能保证 ASCII,尽管您可能永远不会使用没有 ASCII 的系统(如果我是对的)。但并不是 char 以某种方式强制编码 - 它是您将这些字符和字符指针传递给的函数,将它们的内容解释为 ASCII 编码中的字符,而在一些晦涩的或遗留的平台上,他们实际上可以将它们解释为字符一些不太常见的编码。然而,标准要求使用的编码具有此属性:字符“0”到“9”的代码是后续的,因此“9”-“0”意味着:从“9”的代码中减去“0”的代码。结果是 9,因为 '9' 的代码与 ASCII 中的 '0' 代码相距 9 个位置。范围 'a'-'z' 和 'A'-'Z' 也有这种质量,以防万一,但如果您的输入基数高于 10,则有点棘手,例如流行的基数 16称为十六进制。

指针存储地址,因此它最基本的功能是“指向”一个变量。但是它可以以多种方式使用,其中一种在 C 中非常常见,就是存储相同类型变量数组的开头地址。那些可能是字符。我们可以将这样的数组解释为一行文本或一个字符串(一个概念,不要与 C++ 特定的字符串类混淆)。

由于指针不包含有关此类数组的长度或结尾的信息,因此我们需要将该信息传递给我们将指针传递给的函数。有时我们可以只提供长度,有时我们提供结束指针。在处理“文本行”或 c 风格的字符串时,我们使用(和 c 标准库函数期望)所谓的空终止字符串。在这样的字符串中,用于一行的最后一个字符串之后的第一个 charnull,简单来说,它基本上是一个 0。一个 0,而不是一个 '0' .

因此,您传递给函数的内容以及您解释的内容,例如 416,实际上是指向内存中某个位置的指针,其中 '4' 被保存并存储为数字,然后是 '1',然后'6',占用三个字节。并且取决于您如何获得这行文本,“6”可能后跟一个 NULL,即 - 零。 NULL - cppreference.com

将这样的字符串转换为数字首先需要一种能够容纳它的数据类型。在 416 的情况下,它可以是从 short 向上的任何内容。如果您想自己这样做,则需要遍历整行文本并添加乘以适当的 10 次幂的数字,还要注意签名并检查是否存在任何边缘情况。但是,您可以使用像 int atoi (const char * str); 这样的标准函数 atoi - cplusplus.com

现在,这当然很好,但是您正在尝试使用“bigint”。无论您如何定义它们,这意味着您的类的目的是处理要存储在内置类型中的大数字。因此,您无法像那样转换它们。

您现在正在尝试做的似乎是一个构造函数,它从表示为 c 样式字符串的数字中创建一个 bigint。我该怎么说...您想在内部将 bigint 存储为基数为 10 的数字数组(对于代码简单性、可读性和可维护性以及与基数 10 文本表示的互操作而言,这是一个不错的选择,但它没有) t 有效利用内存和处理能力。)并且您的输入也是基数为 10 的数字数组,除了在内部您将数字存储为数字,而您的输入是编码字符。您需要:

  1. 清理输入(您需要确定可接受的输入类型的标准,fe。如果可以有任何前导或尾随空格,数字后面是否可以跟任何要丢弃的非数字字符,如何表示签名,是 + 对于正数可选或禁止等,如果输入无效则抛出异常。
  2. 将您为输入强制执行的任何标准转换为您内部采用的任何统一标准,fe。去除前导空格,删除 + 符号(如果它是可选的并且您不在内部使用它等)。
  3. 当您知道内部数组中的哪些位置与输入字符串中的哪些位置相对应时,您可以迭代它并复制每个数字,首先从 ASCII 解码。

附注 - 我无法确定您期望您的输入究竟是什么,因为它只是可能它是一个文本表示 - 因为它可能就像很容易成为未编码字符的数组。当然,显然是前者,因为你的帖子,我知道这一点,但是函数原型(带有返回类型和参数类型的行)并不能向任何人保证这一点。只是另一件事要注意。 希望这个答案能帮助您了解那里发生的事情。

附注。我怎么强调你的代码最大的问题是,即使这条线有效:

int number1 = number - '0'; // error code

您可能会尝试将 10^50 数量级的数字存储到能够保持 10^9 数量级的变量中

这个问题的关键部分,我有一种模糊的感觉,你可能在 spoj.com 上发现,你正在处理 BIGint。整数太大而无法以简单的方式存储。

1 ) 标准实际上并不直接要求 char 为这个大小,但间接要求它至少为 8 位,在晦涩的平台上可能更多。是的,我认为有些平台确实超过 8 位。指针在晦涩的架构上可能表现得很奇怪。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res