如何打印用户在C中输入的数字的位数?

时间:2015-08-28 21:16:07

标签: c scanf eof

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

我的问题是在按下'ctrl-d'后输出始终为:

“#of digits = 1”

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

“#of digits = 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;
}

3 个答案:

答案 0 :(得分: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;
}

这是未经测试的,但一般的想法是除以10,然后你使用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);
}

答案 1 :(得分:0)

您只需读取字符串,然后使用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()进行测试如果该字符是整数。如果不是,则输入为负数或其他非数字字符。

答案 2 :(得分:0)

以下是使用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;
}