为什么 strtol returns 为零?

why strtol returns zero?

我正在为一个功能而苦苦挣扎。 目标是检查用户输入(已清理)并采取相应行动。

函数如下所示:

bool checkMove(board *Minesweeper,char *input){
  char *tmp;
  switch(input[0]){
    case '?':
      if(isalpha(input[1])){
        input[1]=toupper(input[1]);
        long eval = strtol(input, &tmp, 10);
        if(tmp==input){
          printf("something went wrong :(\n");
        }
        printf("Number: %ld\n",eval);

        if (eval>Minesweeper->height) {
          printf("Out of Bounds!\n");
        } else {
          printf("Valid move\n");
        }
// other stuff

输出:

Your Move: ?A21
something went wrong :(
Number: 0
Valid move

我正在传递输入值,因此它不是本地函数。相同的代码 (strtol) 在不同的上下文中工作得很好。 我不认为这是局部变量的问题。

来自man pages

"The strtol() function converts the initial part of the string..."

您的字符串以“?A”开头,因此函数失败。一种解决方案是改为执行以下操作:

long eval = strtol(input+2, &tmp, 10);

这样你 "skip" input 中的前 2 char 秒。

正如许多人建议的那样,要开始数字转换,请从 input + 2 开始。

// long eval = strtol(input, &tmp, 10);
long eval = strtol(input + 2, &tmp, 10);

谨慎的代码会首先检查严格的长度至少为 2。

if (input[1]) {  // we know input[0] is a '?'`
  long eval = strtol(input + 2, &tmp, 10);

后面的转换校验也需要修改

  // if(tmp == input){
  if(tmp == input + 2) {
    printf("something went wrong :(\n");
  }