在c中仅使用scanf计算中的位数

在c中仅使用scanf计算中的位数,c,C,我需要将用户的输入限制为仅为正值,并计算该数字中的位数。用户将只键入长度不超过9个字符的(+/-)整数 我只允许使用scanf函数和for、while或do-while循环(我在类似的问题中看到了如何使用getchar实现这一点,但我只能使用scanf)。除了stdio.h和math.h之外,我不允许使用数组或任何其他库 我知道如果我写: n=scanf(“%c%c%c%c%c”、&a、&b、&c、&e、&f) n将计算成功的scanf转换数 我遇到的问题是,当我用char定义输入时,除了用户必

我需要将用户的输入限制为仅为正值,并计算该数字中的位数。用户将只键入长度不超过9个字符的(+/-)整数

我只允许使用scanf函数和for、while或do-while循环(我在类似的问题中看到了如何使用getchar实现这一点,但我只能使用scanf)。除了stdio.h和math.h之外,我不允许使用数组或任何其他库

我知道如果我写:

n=scanf(“%c%c%c%c%c”、&a、&b、&c、&e、&f)

n将计算成功的scanf转换数

我遇到的问题是,当我用char定义输入时,除了用户必须输入5个字符之外,它完成了我想要的一切。因此,如果用户想要输入“55”,他必须按“5”“5”“回车”“回车”

我需要的程序移动后,第一个“输入”,但也可以灵活地接收一个数字长达9位


再说一遍,我不能使用getchar或任何花哨的东西。这是你在前两周学到的C语言的基本知识

使用scanf将数字读入
长整数
,然后使用带/10的for循环来计算位数

如果输入了-ve号码,您希望程序做什么

#include<stdio.h>
int main()
{

    long int a;
    int b;
    do
    {
    scanf ("%ld",&a);
    if(a<0)
        printf ("invalid input");
    }while(a<0);

    for(b=0;a!=0;b++,a=a/10);
    printf("%d",b);
}
#包括
int main()
{
长INTA;
int b;
做
{
scanf(“%ld”、&a);

如果(a,我将采取以下方法

  • 循环是允许的,所以继续设置一个循环
  • 你需要在某个地方有一个变量来跟踪当前的数字
  • 考虑键入一个数字,一次键入一个字符。当前的\u number变量需要做什么
  • 如果按下返回键,则需要停止循环
  • 对于初学者来说,这样做应该可以,但我将把其余的事情留给您,特别是
    返回检查(ch)
    更新状态(当前值)
    字符到int(ch)
    看起来像什么。另外请注意,不要使用函数,可以将自己的函数直接放入代码中

    int current_val=0;
    int num_digits=0;
    char ch="\0"
    
    for (num_digits=0;return_check(ch) && num_digits<=9;num_digits++)
    {
      fscanf("%c");
      current_val=update_state(current_val);
      current_val=current_val+char_to_int(ch);
    }
    
    int current\u val=0;
    int num_位=0;
    char ch=“\0”
    
    对于(num_digits=0;return_check(ch)&&num_digits,可以在其周围环绕一个循环,比如(我不知道所有语法是否都正确):

    const int max_size=9
    int n=0;//输入字符数的计数器
    字符a[max_size-1];
    做{
    scanf(%c,&a[n]);
    n++;
    }而(a[n]!='\r'&&n类似

    #include <stdio.h>
    
    int main(void)
    {
      char buffer[10] = { 0 };
      size_t len;
    
      scanf("%9[0-9]", buffer);
      for(len = 0; buffer[len] != 0; len++) ;
      printf("%zu '%s'\n", len, buffer);
    
      return 0;
    }
    
    #包括
    内部主(空)
    {
    字符缓冲区[10]={0};
    尺寸透镜;
    scanf(“%9[0-9]”,缓冲区);
    for(len=0;buffer[len]!=0;len++);
    printf(“%s”\n”,len,缓冲区);
    返回0;
    }
    
    行,但我不知道它是否适合你的需要

    编辑(一些解释)

    您可以用int(或无符号int)替换
    size\u t
    ,尽管
    size\u t
    更好。如果这样做,请使用
    %d
    %u
    而不是
    %zu

    基本思想是利用scanf格式的一个特性;
    9[0-9]
    表示输入是给定集合中最多9个字符的序列,即从0到9的数字


    (…)
    只是一种计算字符数的方法,是
    strlen
    的简单实现。然后我们打印结果。

    谢谢,这是我需要的。负数将提示“无效输入”打印并将返回循环。更新代码以向您提供无效的输入提示。如果您不允许使用If条件,则用while循环替换If条件很容易。我可以使用If条件。for条件后面应该有分号吗?非常感谢!是的,分号应该在for.t之后想象一下如果没有它会发生什么,它不能正常工作;试着给它输入一个大的int,比如
    1234444543434555555555
    ,或者输入一个非数字,比如
    ddd
    ,或者一个十位数的数字……或者,magic,输入
    0
    。结果将是错误的;有两个缺陷需要修复。删除它,它不会被使用(包含标题并不意味着要使用它……起初我使用strlen,后来当我意识到您无法使用它时,将其更改为for循环)
    #include <stdio.h>
    
    int main(void)
    {
      char buffer[10] = { 0 };
      size_t len;
    
      scanf("%9[0-9]", buffer);
      for(len = 0; buffer[len] != 0; len++) ;
      printf("%zu '%s'\n", len, buffer);
    
      return 0;
    }