c++ - 自定义strtoi函数编译时间问题

标签 c++ c++11 compile-time-constant

我正在尝试实现一个非常简单的strtoi函数。当动态创建传递的参数时(下面的情况2),它可以正常工作。但是,如果char是由在编译时分配的char[]创建的,则由于len弄乱了我的逻辑,因此我在std::strlen(ch)上获得了一个恒定值,因此我无法找到解决方案。

 int strtoi(char* ch)
 {   
  int sum {0};
  int len = static_cast<int>(std::strlen(ch));
  int skipLast = static_cast<int>(static_cast<int>(ch[0]) == 45);

  //Integer Method
  for(int i = len - 1; i >= 0 + skipLast; i--)
  {
    if(static_cast<int>(ch[i]) < 48 || static_cast<int>(ch[i]) > 57)
      return 0;
    sum += (ch[i]-48) * std::pow(10,i-skipLast);
  }

   sum = skipLast == 1 ? -sum : sum;
   return sum;
 }

int main()
{
  char pos[3] {'1','2','3'};
  std::cout << strtoi(pos) << std::endl;
  char neg[4] {'-','1','2','3'};
  std::cout << strtoi(neg) << std::endl;
  return 0;
}

返回:0-123。我的函数中的len变量未获得第一次调用的预期值,我认为这是因为neg[4]pos[3]分配了更多的内存。但是,对于第二种情况:
int main()
{
  char* pos;
  pos = new char[3] {'1','2','3'};
  std::cout << strtoi(pos) << std::endl;
  char* neg;
  neg = new char[4] {'-','1','2','3'};
  std::cout << strtoi(neg) << std::endl;
  return 0;
}

返回123-123。预期的结果。
我猜这是因为在第一种情况下,编译器根据char[4]数组为函数及其参数分配了内存。它是否正确?
在第二种情况下它是如何工作的,编译器如何为动态变量的函数分配内存?
使函数在两种情况下都可以工作的解决方案是什么?
在此先感谢您的帮助。

最佳答案

strlen要求字符串以null终止,如下所示:

char* pos = new char[4] {'1','2','3','\0'};
std::cout << strlen(pos) << "\n";  // Shows "3"

添加此空终止符有一个捷径:
const char[] pos = "123";
std::cout << strlen(pos) << "\n";  // Shows "3"
std::cout << sizeof(pot) << "\n";  // Shows "4"

我使用pos的数组类型只是为了说明它实际上是4个字符。您可以改用const char*(实际上是典型的),但是sizeof行不起作用。

请注意,如果您分配这样的字符串文字,那么以后就不能在其上使用delete,而如果您对数组使用deletenew,则可以(并且应该)使用delete[]

关于c++ - 自定义strtoi函数编译时间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60447950/

相关文章:

c++ - 使用用户输入创建一个 json 数据库

c# - 如何在 C# 中声明常量 Guid?

c++ - 如何知道 Tar 解析器里面的文件

c++ - QStandardItemModel 中项目的重新分配

c++ - Armadillo 相当于 Matlab 置换?

c++ - 通过 char 将 .txt 读入 vector 但不忽略空格

c++ - CRTP 和表达式模板 线性代数

c++ - 将变量参数列表转发到模拟 std::thread

c++ - 在哪里定义编译时常量?

c++ - 有没有办法为静态对象成员定义一个符合开关的常量?