我主要是一个电子硬件人,但我从朋友那里学到了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)
^
答案 0 :(得分:3)
首先,在下面的陈述中,
while(phew < sizeof(input))
调用undefined behavior,因为phew
是一个自动局部变量而未初始化。您需要初始化phew
,例如int phew = 0;
在这种情况下,sizeof(input)
有效,但没有任何意义。
也就是说,您只能在数组类型上使用[]
运算符。在您的情况下,input
是int
,因此您不得撰写input[n]
。
详细说明,引用C11
标准,章节§6.5.2.1
语法
postfix-expression
[
表达]
和描述
其中一个表达式的类型指向完整的对象类型,另一个 expression应具有整数类型,结果类型为 type 。
所以,显然,在您的情况下input
不是“指向类型指针”,因此错误。
要解决问题,
您可以将input
的类型更改为char input[32] = {0};
将扫描语句更改为`scanf(“%29s”,输入);
添加while(phew < strlen(input))
有意义。你需要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。然后mask
为bitwise-ANDed input
,如果input
中的该位为0,则给出0的值(否则某个非零值等于位的位值) )。不要忘记在最后打印出换行符,否则输出可能不可见。
我在这里使用unsigned
算术因为<<
可以对C中的带符号数字执行实现定义或未定义的行为。input
可以是常规(带符号){{1} }因为int
运算符为promoted到unsigned
。
另请注意,我必须将&
乘以sizeof input
(在CHAR_BIT
中定义)以获取位数; <limits.h>
始终测量字节中的大小。
另请参阅this C FAQ (20.7)有关位操作的信息。