【问题标题】:How to print the number of digits of a number that is entered by the user in C? [closed]如何打印用户在C中输入的数字的位数? [关闭]
【发布时间】:2015-08-28 21:16:07
【问题描述】:

您好,我正在尝试编写 C 代码,提示用户输入一个正整数,然后打印出该数字的位数。假设用户输入一个正整数,则不需要进行错误检查。

我的问题是按下'ctrl-d'后输出总是:

"位数 = 1"

如果用户键入 1023,程序应该打印:

"位数 = 4"

我是 C 新手,正在尝试了解 scanf 的工作原理。谢谢!

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
int count = 0;
char n;
printf("Enter positive int!\n");

   while(scanf("%c",&n) != EOF);
    {
     count++;
    }

printf("# of digits = %d\n", count);
return 0;
}

【问题讨论】:

  • 去掉while后面的分号。提示:将大括号与while/if 等放在同一行。
  • %c in scanf 将计算用户在数字后输入的换行符。
  • 请不要默默地编辑代码中的真正错误。这完全改变了它的内容。
  • scanf 阻止,直到您以 enter 或 Ctrl+D 结束
  • 明白,感谢您对无声编辑感到抱歉。

标签: c scanf eof


【解决方案1】:

您可以使用%d 格式说明符输入一个十进制整数和scanf,然后应用以下函数:

int getNumOfDigits(int num, int base /*= 10*/)
{
    int count = 0;

    if (num < 0) {
        num = -num;
    }
    while (num > 0) {
        count++;
        num /= base;
    }
    return count;
}

它未经测试,但一般的想法是除以十,然后你去int数字的位数:

printf("# of digits = %d\n", getNumOfDigits(number, 10));

请注意,您还应该检查来自scanf 的返回值以进行错误处理(当数字格式不正确时)。例如:

if (scanf("%d", &number) != 1) {
    printf("Incorrent input for decimal number!\n");
    exit(EXIT_FAILURE);
}

【讨论】:

  • 如果用户输入00100会怎样;您的代码将计算三位数,问题中代码的固定版本会说五位数。任何一个或两者都可能是特定问题的正确答案。
  • @JonathanLeffler:这取决于00100 对用户意味着什么。它可能是一个八进制数,那么应该使用%i f.s。允许其他基础(八进制,十六进制)。但是,它可能会被截断为100,这是我认为的理想输出,因为这样的前导零是没有意义的。
【解决方案2】:

您可以简单地读入一个字符串,然后使用strlen() 检查它的长度:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX_LEN 64

int
main(int argc, char** argv)
{
    char buf[MAX_LEN] = {0};

    scanf("%s", buf);    
    fprintf(stdout, "string length: %lu\n", strlen(buf));

    return EXIT_SUCCESS;
}

如果您需要验证输入(即确保它是一个数字),您可以像上面那样读取字符串,在打印字符串长度之前,循环遍历每个字符并使用isdigit() 来测试是否字符是一个整数。如果不是,则输入是负数或其他一些非数字字符。

【讨论】:

  • scanf%s == gets(而gets 太糟糕了以至于 ISO 弃用了它)。
  • 我不确定它们是否等效,但您可以使用 scanf("%63s", buf) 来避免溢出。
【解决方案3】:

这是使用log10()查找位数的一种方法

#include <stdio.h>
#include <math.h>

int main (void)
{
    unsigned number;
    scanf("%u", &number);
    printf("%.0f\n", ceil(log10((double)number+1)));
    return 0;
}

这里还有另一种方式,sprintf() 返回写入的字符数

#include <stdio.h>
#include <math.h>

int main (void)
{
    unsigned number;
    char str[20];
    scanf("%u", &number);
    printf("%d\n", sprintf(str,"%u", number));
    return 0;
}

【讨论】:

  • @BLUEPIXY 哦哦我的坏。现在加了1个,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多