在C中调试代码以确定数字的长度?

时间:2017-12-28 22:06:14

标签: c loops while-loop do-while cs50

所以,我正在研究C中的代码,用于计算给定数字的长度。我现在知道正确的方法来解决这个问题。但是,我不明白为什么我的原始代码是错误的。有人可以帮我调试吗?

编辑:我也想知道为什么while中的参数应该是“dgts!= 0”或“dgts> 0”?比如,你能解释一下这意味着什么以及它有意义吗?

#include <stdio.h>
#include <cs50.h>


int lngth (int dgts);

int main(void){
    int num = get_long_long();
    int length = lngth(num);
    printf("%i",length);
}
int lngth (int dgts){
    int cnt = 0;
    int y = dgts;
    while (dgts !=0 ){
        y = y/10;
         cnt ++;
        printf("%i\n",cnt);
    }
    return cnt;
}

3 个答案:

答案 0 :(得分:0)

正如Jean-FrançoisFabre在评论中所提到的,你在int lngth (int dgts)函数中创建了一个无限循环:

    while (dgts !=0 ){
        y = y/10;
        ...
    }

由于条件dgts != 0依赖于dgts而不是yyy = y/10的变化,因此循环永远不会完成。

答案 1 :(得分:0)

代码有两个问题:

  1. while (dgts !=0 ){ y = y/10; cnt ++; } dgts的无限循环永远不会改变,因此一旦代码进入循环,它就会卡在那里。 @Jean-François Fabre

  2. dgts == 0时的可疑安排,因为它通常是一位数字而不是无数字。 do循环是一个简单的解决方案。

  3. 修复代码:

    int lngth(int dgts) {
      int cnt = 0;
      do {
        cnt++;
        printf("%i\n", cnt);
        dgts /= 10; 
      } while (dgts);  // while dgts is non-zero
      return cnt;
    }
    

    给定数字的长度正在研究小数位数的概念。如果长度包含'-'的负数,则只需要进行少量更改。

      // int cnt = 0;
      int cnt = dgts < 0;
    

答案 2 :(得分:0)

while循环条件中存在拼写错误

while (dgts !=0 ){
       ^^^^^^^^

我认为你的意思是

while (y !=0 ){
       ^^^^^

但无论如何,该函数是错误的,因为它的参数可以等于00是一个包含一位数的有效数字。

将返回类型定义为int也没有意义,因为数字的长度不能为负值。

该功能可以看起来像

unsigned int lngth ( int dgts )
{
    const int Base = 10;

    unsigned int cnt = 0;

    do
    {
        ++cnt;
    } while ( dgts /= Base );


    return cnt;
}

主要是你应该写

unsigned int length = lngth(num);
printf("%u\n", length );

还要考虑函数get_long_long似乎返回long long int类型的整数。

如果是,那么你应该写

long long int num = get_long_long();

在这种情况下,应该声明函数

unsigned int lngth ( long long int dgts );

请注意,没有理由声明dgtslngth等标识符。使用完整的单词。例如

unsigned int length ( long long int number );
             ^^^^^^                 ^^^^^^

或者只是

unsigned int length ( long long int n );
             ^^^^^^                ^^^