0

我已将映射到内存中的文件的内容提取到一个数组中,如下所示:

char* const arr = static_cast<char *>(file.get_address());

在遍历数组时,我希望能够调用:

for(int i=0; i<file.get_size(); i++){
    atoi(arr[i]);
}

但是,atoi 需要 const char* 类型,而 arr[i] 是 char* const 类型。我该如何解决这个问题?

4

2 回答 2

3

首先,我质疑你使用constin...

char* const arr = static_cast<char *>(file.get_address());

在这种情况下,const适用于指针,而不是它指向的内容。所以,通过你的arr指针,你可以做到这一点......

arr[0] = 'a';

...我认为这不是您要防止的。相反,我认为您真正想要的是:

const char* arr = static_cast<const char *>(file.get_address());

...这解决了您发布的问题。这样,您就有了一个指向无法更改的字符的指针(至少不能直接通过该指针)。

然后,在你的循环中,你在整个文件的每个字符上调用 atoi() ,我怀疑这是你真正想要做的。您是否期待一大堆没有分隔符的个位数十进制(以 10 为底)数字?这是以您的方式循环的唯一用例。为了争论,让我们假设这就是你真正想要的。好的,那么,您希望结果到哪里?您没有将 atoi() 的返回值分配给任何东西。您正在将单个数字(可能是 ASCII)数字从文本转换为数字形式,但会丢弃结果。

但我认为这可能不是你真正想要的。

让我们重写您的代码,以便它将文件的第一个文本值(假设它前面没有垃圾)转换为整数,然后打印它。在您的示例中,我们假设文件已经读入某个名为的对象file,并且我们可以通过调用来获取其数据缓冲区file.get_address()。这就是你想要的:

const char* arr = static_cast<const char *>(file.get_address());

int firstNumericValue = atoi(arr);

std::cout << "firstNumericValue = " << firstNumericValue << "\n";

...就是这样,不需要循环!如果您想从文件中读取多个值,当然可以使用循环,但您需要研究更高级的函数,例如sscanf()or strtol()。如果您使用 strtol(),它的第二个参数可以让您获得一个指向下一个位置的指针,以便为任何后续调用开始转换。但是这些例子比比皆是,你可以自己研究它们。

于 2012-12-18T22:11:44.957 回答
2
atoi(&(arr[i]));

会成功的。

运算符为您提供指向 char的&指针,额外的括号确保您获得指向i-th 元素的指针。

atoi 不关心数组声明中的 const,所以它在这里不相关。

于 2012-12-18T21:40:08.713 回答