0

我有一段非常简单的代码,可以检查给定的数字是否是排列

(位数 < 8;每个数字只显示一次)

从未知原因到我,带有标记注释 ( HERE) 的循环只通过一次。有人可以帮我吗?

#include <stdio.h>
#include <stdbool.h>

int num_digits(int number)
{
    int digits = 0;
    while (number) {
        number /= 10;
        digits++;
    }
    return digits;
}

int get_n_digit(int number, int which)
{
  if(which > num_digits(number))
  {
    printf("This number %d does not have that many digits: %d\n",number, which);
    return -1;
  }

  int to_return = number;
  int i = 0;
  for(i = 0; i < num_digits(number) - which;i++)
  {
    int digit = number % 10;
     to_return /= 10;
  }
  printf("get_n_digit(%d,%d)=%d\n",number,which, to_return %10);
  return to_return % 10;
}

bool permutation_check(int number)
{
  bool to_return = true;
  if(num_digits(number) > 8)
  {
    printf("Your number has more than 8 digits\n");
    return false;
  }
  int temp[10];
  int i;
  for( i = 0; i < 10; i++)
  {
    temp[i]=0;
  }

  printf(" for( i = 0; i < num_digits(%d) =  %d; i++)\n",number, num_digits(number));
  for( i = 0; i < num_digits(number); i++);
  {
    //HERE
    printf("temp[get_n_digit(%d,%d)]++;\n",number,i);
    temp[get_n_digit(number,i)]++;
    if( temp[get_n_digit(number,i)] > 1)
    {
      to_return = false;
    }
  }

  for( i = 0; i < 10; i++)
  {
    printf("%d\n",temp[i]);
  }
  return to_return;
}

int main(void)
{
  char line[256];
  int i, a;
  printf("Put a number to be checked for permutation condition.\n");
  if (fgets(line, sizeof(line), stdin)) {
      if (1 == sscanf(line, "%d", &i)) {
        printf("This many digits in this number: %d\n", num_digits(i));
        if(num_digits(i)<8)
        {
          if(permutation_check(i))
            printf("This number is a permutation.\n");
          else
            printf("This number is NOT a permutation.\n");
        }
   }
  }
  return 0;
}
4

2 回答 2

16

您的 for 语句末尾有一个分号

for( i = 0; i < num_digits(number); i++); // <-- Semicolon
于 2013-05-20T20:57:03.810 回答
4

首先请用-Wall -Werror -Wextra. 特别是这个被 捕获-Wempty-body,它被启用-Wextra但不是-Wall。你根本不能犯这个错误。

发现代码有问题的最好方法是准确地理解它在做什么。这就是调试器的用途。您可以在 IDE 中执行此操作,如果您不使用 IDE,则在 *nix 上使用的工具是 gdb。

  1. -g用标志编译你的代码。
  2. 运行为例如gdb a.out
  3. 在 main 中设置断点 - (gdb) break main
  4. 跑 -(gdb) run

逐步检查您的代码,并准确查看它在做什么,以及它在哪里违反了您的期望。在Eclipse中双击main函数旁边的行号设置断点,点击调试符号运行,大概是昆虫的图形。我想 Visual Studio C++ 会是类似的。

在您的情况下,您希望在 for 循环所在的行上设置一个断点。

gdb break <line #>

然后next你的方式通过。对于像这样的简单代码文件,它可能会立即清楚发生了什么——或者至少你会有一个更具体的问题需要处理。

这个答案的适当性涵盖在 meta 上

于 2013-05-20T20:59:24.320 回答