【问题标题】:counting the number of digits in using only scanf in c在c中仅使用scanf计算位数
【发布时间】:2012-04-16 11:39:27
【问题描述】:

我需要将用户的输入限制为仅正值,并计算该数字中的位数。用户只能输入一个 (+/-) 整数,最多 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”“enter”“enter”“enter”。

我需要程序在第一次“输入”后继续前进,但也需要灵活地接收最多 9 位数字的数字。

再次,我不能使用 getchar 或任何花哨的东西。只是你在前 2 周学习的 C 语言中真正基本的东西。

【问题讨论】:

    标签: c


    【解决方案1】:

    使用 scanf 将数字读入 long int ,然后使用带有 /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);
    }
    

    (不专门处理 -ve 数字)

    【讨论】:

    • 谢谢,这正是我所需要的。负数将提示“无效输入”打印并返回循环。
    • 更新了代码给你无效的输入提示。如果不允许使用 if 条件,则用 while 循环替换 if 条件很容易
    • 我可以使用 if 条件。在 for 条件之后应该有一个分号吗?非常感谢!
    • 是的,分号应该在for之后。想想没有它会发生什么
    • 它不能正常工作;尝试用一个大整数来喂它,比如12344444444444444445434345555555555555,或者用一个非数字,比如ddd,或者一个十位数的数字......或者,魔术,用0......结果将是错误的;有两个缺陷需要修复。
    【解决方案2】:

    类似

    #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;
    }
    

    有效,但我不知道它是否符合您的需要。

    编辑(一些解释)

    您可以用 int(或 unsigned int)替换 size_t,尽管 size_t 更好。如果这样做,请使用%d%u 而不是%zu

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

    for(...) 只是一种计数 char 的方法,strlen 的简单实现。然后我们打印结果。

    【讨论】:

    • 删除它,它没有被使用(包括一个标题并不意味着使用它......起初我使用了strlen,然后当我意识到你不能时将其更改为for循环使用它)
    【解决方案3】:

    我将采取的方法如下。

    1. 允许循环,因此请继续设置。
    2. 您需要有一个变量来跟踪当前数字是多少。
    3. 考虑一次输入一个数字,一个字符。 current_number 变量需要做什么?
    4. 如果按下返回键,您需要停止循环。

    对于初学者来说,这样的事情应该可以做,但剩下的就交给你了,特别是 return_check(ch)update_state(current_val)char_to_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);
    }
    

    至于 update_state() 中的逻辑,想想如果用户输入一个数字(例如 123456789),一次一个字符会发生什么。current_val 与 1 到 12 以及 12 到 a 有何不同? 123.

    【讨论】:

      【解决方案4】:

      你能在它周围环绕一个循环吗,比如(我不知道所有的语法是否都正确):

      const int max_size=9
      int n=0; //counter for number of chars entered
      char a[max_size-1];
      do {
          scanf(%c,&a[n]);
          n++;
      } while (a[n] != '\r' && n<max_size)
      

      【讨论】:

        猜你喜欢
        • 2015-04-19
        • 2021-08-18
        • 1970-01-01
        • 2011-05-07
        • 2014-02-21
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        相关资源
        最近更新 更多