如何解决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 标准库函数期望)所谓的空终止字符串。在这样的字符串中,用于一行的最后一个字符串之后的第一个 char
是 null,简单来说,它基本上是一个 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 的数字数组,除了在内部您将数字存储为数字,而您的输入是编码字符。您需要:
- 清理输入(您需要确定可接受的输入类型的标准,fe。如果可以有任何前导或尾随空格,数字后面是否可以跟任何要丢弃的非数字字符,如何表示签名,是
+
对于正数可选或禁止等,如果输入无效则抛出异常。 - 将您为输入强制执行的任何标准转换为您内部采用的任何统一标准,fe。去除前导空格,删除
+
符号(如果它是可选的并且您不在内部使用它等)。 - 当您知道内部数组中的哪些位置与输入字符串中的哪些位置相对应时,您可以迭代它并复制每个数字,首先从 ASCII 解码。
附注 - 我无法确定您期望您的输入究竟是什么,因为它只是可能它是一个文本表示 - 因为它可能就像很容易成为未编码字符的数组。当然,显然是前者,因为你的帖子,我知道这一点,但是函数原型(带有返回类型和参数类型的行)并不能向任何人保证这一点。只是另一件事要注意。 希望这个答案能帮助您了解那里发生的事情。
附注。我怎么强调你的代码最大的问题是,即使这条线有效:
int number1 = number - '0'; // error code
您可能会尝试将 10^50 数量级的数字存储到能够保持 10^9 数量级的变量中
这个问题的关键部分,我有一种模糊的感觉,你可能在 spoj.com 上发现,你正在处理 BIGint。整数太大而无法以简单的方式存储。
1 ) 标准实际上并不直接要求 char 为这个大小,但间接要求它至少为 8 位,在晦涩的平台上可能更多。是的,我认为有些平台确实超过 8 位。指针在晦涩的架构上可能表现得很奇怪。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。