自定义 strtoi 函数编译时问题

Sch*_*eir 1 c++ compile-time-constant c++11

我正在尝试实现一个非常简单的strtoi功能。当动态创建传递的参数时,它工作正常(下面的情况 2)。但是,如果char[]在编译时分配的 char 是由which创建的,我会得到一个常量值,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;
}
Run Code Online (Sandbox Code Playgroud)

返回:0-123len我的函数中的变量没有获得第一次调用的预期值,我认为这是因为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;
}
Run Code Online (Sandbox Code Playgroud)

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

Art*_*cca 5

strlen 要求字符串以空字符结尾,如下所示:

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

添加这个空终止符有一个简写:

const char[] pos = "123";
std::cout << strlen(pos) << "\n";  // Shows "3"
std::cout << sizeof(pot) << "\n";  // Shows "4"
Run Code Online (Sandbox Code Playgroud)

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

请注意,如果您分配这样的字符串文字delete,则以后不能在它上面使用,而delete如果您使用new, 或delete[]数组,则可以(并且应该)使用它。