【问题标题】:Counter in C LanguageC语言中的计数器
【发布时间】:2016-01-19 13:16:49
【问题描述】:

我主要是一名电子硬件专家,但我从朋友那里学到了 D 的基础知识,所以我决定选择一种更标准的语言,比如 C。所以,任何建议都会很棒。 基本上,我使用整数 'phew' 作为计数器来反转所有数字。超级基本,但我在 C 中找不到方法。我的代码:

#include <stdio.h>

int main()
{
     int input;
     int phew;
     printf("Binary Number: ");
     scanf("%d", &input);
     while(phew < sizeof(input))
     {
          if(input[phew] == 0)
               printf("1");
          else
               printf("0");
          phew++;
      }
      return 0;
}

编译器错误是:

helloworld.c: In function ‘main’:
helloworld.c:11:11: error: subscripted value is neither array nor pointer nor vector
if(input[phew] == 0)
        ^

【问题讨论】:

  • [] 是下标运算符,只能用于数组和指针数据类型,input 两者都不是。
  • 编译器告诉您input 不是数组,这就是您尝试使用它的方式。在被赋予值之前,您还可以通过使用phew 获得未定义的行为。本地(自动)变量未初始化。
  • 即使input一个数组,while(phew &lt; sizeof(input))是不正确的,那不是元素的数量。
  • 我建议在您的问题中使用更精确的语言,因为“反转所有数字”并没有真正的意义。反转什么?位数?命令?看起来你正在尝试做的是“按位值的升序打印整数的位”,所以我已经根据这个假设写了一个答案。
  • 我回滚了,因为关于网站使用的咆哮不应该进入问题/答案。如果您觉得您对该网站的定义与其他用户不同,请在meta.stackoverflow.com 上提出辩论,而不是在您自己的技术问题中。

标签: c arrays int sizeof


【解决方案1】:

首先,在下面的语句中,

 while(phew < sizeof(input))
  • 调用undefined behavior,因为phew 是一个自动局部变量且未初始化。你需要像int phew = 0;一样初始化phew

  • 在这种情况下,sizeof(input) 有效,但没有任何意义。

也就是说,您只能在数组类型上使用 [] 运算符。在你的情况下,input 是一个int,所以你不能写input[n]

详细说明,引用C11 标准,第 §6.5.2.1 章

语法

后缀表达式 [ 表达式 ]

和描述

其中一个表达式应具有类型指向完整对象类型的指针,另一个 表达式应为整数类型,结果为type类型。

所以,很明显,在您的情况下,input 不是 “pointer-to-type”,因此会出现错误。

为了解决问题,

  1. 可以将input的类型改为char input[32] = {0};

  2. 将扫描语句更改为 `scanf("%29s", input);

  3. 添加while(phew &lt; strlen(input))

说得通。为此,您将需要 string.h 头文件。查看strlen() here的详细信息。

你必须像这样改变它

while(phew <  strlen(input) )
 {
      if(input[phew] == '0')  //ASCII 48, decimal
           printf("1");
      else
           printf("0");
      phew++;
  }

【讨论】:

  • @WeatherVane 只是解决了这部分问题。谢谢。 :)
  • sizeof(input) 不是元素的数量。这是一个int 数组而不是char 数组。
  • 他实际上试图索引input的每个
  • @WeatherVane 我认为char 数组将大致解决问题,不是吗?
  • 这个问题表述得不好,但我认为 OP 正试图 reverse 二进制输入,所以是的,char 数组可以完成这项工作。
【解决方案2】:

您不能使用[] 在 C 中获取整数位;该运算符仅适用于指针值,int 不是指针。您可能熟悉 Verilog,其中位向量和整数是一回事;但 C 没有访问对象位的语法,[] 仅用于访问数组成员。

一种正确的方法是使用位掩码。例如:

for (size_t i = 0; i < (sizeof input)*CHAR_BIT; i++) {
    unsigned mask = 1 << i;
    if (input & mask) {
        putchar('1');
    } else {
        putchar('0');
    }
}
putchar('\n');

这段代码在循环的每次迭代中所做的就是创建一个无符号整数mask,将shifting 数字1 放入整数的第i 位。然后maskbitwise-ANDedinput,如果该位在input 中为0,则给出一个值为0(否则一些非零值等于该位的位置值)。不要忘记在末尾打印一个换行符,否则输出可能不可见。

我在这里使用unsigned 算术,因为&lt;&lt; 可以对C 中的有符号数具有实现定义或未定义的行为。input 可以是常规(有符号)int,因为它将是promoted&amp; 操作员发送至unsigned

另外请注意,我必须将sizeof input 乘以CHAR_BIT(在&lt;limits.h&gt; 中定义)才能得到比特数sizeof 总是以 字节 为单位测量大小。

另请参阅this C FAQ (20.7) 了解位操作。

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 2017-01-12
    • 2013-12-03
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多