用C语言计数器

时间:2016-01-19 13:16:50

标签: c arrays int sizeof

我主要是一个电子硬件人,但我从朋友那里学到了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)
        ^

2 个答案:

答案 0 :(得分:3)

首先,在下面的陈述中,

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

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

也就是说,您只能在数组类型上使用[]运算符。在您的情况下,inputint,因此您不得撰写input[n]

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

  

语法

     

postfix-expression [ 表达 ]

和描述

  

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

所以,显然,在您的情况下input不是“指向类型指针”,因此错误。

要解决问题,

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

  2. 将扫描语句更改为`scanf(“%29s”,输入);

  3. 添加while(phew < strlen(input))

  4. 有意义。你需要string.h头文件。查看有关strlen() here

    的详细信息

    你必须像

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

答案 1 :(得分:0)

您不能使用[]来获取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');

此代码在循环的每次迭代中执行的操作是将shifting的无符号整数mask创建为整数i位置的数字1。然后maskbitwise-ANDed input,如果input中的该位为0,则给出0的值(否则某个非零值等于位的位值) )。不要忘记在最后打印出换行符,否则输出可能不可见。

我在这里使用unsigned算术因为<<可以对C中的带符号数字执行实现定义或未定义的行为。input可以是常规(带符号){{1} }因为int运算符为promotedunsigned

另请注意,我必须将&乘以sizeof input(在CHAR_BIT中定义)以获取位数; <limits.h>始终测量字节中的大小。

另请参阅this C FAQ (20.7)有关位操作的信息。