【问题标题】:why strtol returns zero? [duplicate]为什么 strtol 返回零? [复制]
【发布时间】:2019-12-21 18:09:16
【问题描述】:

我正在为一个函数而苦苦挣扎。 目标是检查用户输入(已清理)并采取相应措施。

函数如下所示:

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)在不同的上下文中工作得很好。 我不认为这是局部变量的问题。

【问题讨论】:

  • 代码似乎正确;您在哪里寻找问题?
  • “Your Move:”后面打印的是input的值吗?
  • 您好,我想将输入中的数字转换为 int。所以我可以稍后使用它们(条件检查等)例如查看 if 语句,我将 eval(转换结果)与游戏板的高度进行比较。但是如果我不能转换字符串中的数字,我不能与他们合作。
  • input+2&input[2] 含义完全相同。
  • @U.Windl “代码似乎正确”——不,真的,它没有。

标签: c strtol


【解决方案1】:

来自man pages

"strtol() 函数转换字符串的初始部分..."

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

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

这样您“跳过”input 中的前 2 个 chars。

【讨论】:

  • 这很好用。你能解释一下“初始部分”是什么意思吗?我了解到,如果您向 strtol 抛出一个字符串,例如char[20] = "A2124B21",strtol 会将其拆分为2124,下一个拆分为21。我不明白为什么我的字符串A?21 让函数失败。为什么它不转换包含的数字?
  • @h1ghrise "如果你向 strtol 抛出一个字符串,如 char[20] = "A2124B21" strtol 会将其拆分为 2124 和下一个 21" --> 不,它不会。跨度>
  • 我不认为你的学习资源当时很好。手册页对此非常清楚:字符串 必须 以数字开头,否则它将失败。很高兴我的回答有帮助。干杯:)
  • @chux-ReinstateMonica 是的。你是完全正确的。我误解了。当然它只转换 initial 部分。我现在明白了。很抱歉造成混乱。哦...
  • 详细,字符串可以以空格、符号字符和数字开头以开始成功转换。
【解决方案2】:

正如许多人建议的那样,要开始数字转换,请从 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");
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多