为什么C中的循环只传递一次?

时间:2013-05-20 20:53:56

标签: c for-loop

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

(位数< 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;
}

2 个答案:

答案 0 :(得分:16)

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

for( i = 0; i < num_digits(number); i++); // <-- Semicolon

答案 1 :(得分:4)

首先请使用-Wall -Werror -Wextra进行编译。特别是-Wempty-body抓住了这个-Wextra-Wall-g启用了gdb a.out。你根本无法犯这个错误。

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

  1. 使用(gdb) run标记编译代码。
  2. 以...运行gdb break <line #>
  3. 在main中设置断点 - (gdb)break main
  4. 运行 - next
  5. 逐步查看代码,确切了解它的作用,以及它违反了您的期望。 在Eclipse中,双击main函数旁边的行号以设置断点,然后单击调试符号运行,该符号可能是昆虫的图形。我想,Visual Studio C ++会是类似的。

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

    {{1}}

    然后{{1}}你的方式通过。对于这样一个简单的代码文件,很可能会立即显现正在发生的事情 - 或者至少你会遇到更具体的问题。

    这个答案的恰当性涵盖on meta