我一直在阅读K&R C编程语言书,我坚持练习2-6,内容如下:
写一个函数setbits(x,p,n,y)返回x,其中n位从位置p开始,设置为y的最右边n位,其他位保持不变.
我无法理解他们正在寻找我的确切事情.我在这里看了一个可能的答案,但我仍然不太明白.我认为这是让我失望的措辞.任何人都可以用不同的方式解释他们想要我做什么吗?我希望不同的措辞能帮助我理解我需要做的代码.
我正在尝试执行以下代码,这是1988年的混淆C代码竞赛条目.
#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_
_-_-_-_
}
Run Code Online (Sandbox Code Playgroud)
从条目描述中,此代码通过查看其自己的区域来计算pi.我成功编译它而不更改代码.但是当我执行时,它给了我0.25的值,我期待的是3.14.代码描述表明它在K&R C中,如果没有一些更改,它在ANSI C中无法正常工作.我想我必须做那些修改才能正确执行它.我以前没有K&R C的经验.所以有人可以帮助我将上述代码更改为ANSI C或指出问题(如果有的话).我正在使用Microsoft Visual Studio 2008来执行此操作.
"不可能"的K&R练习.
"编写一个程序entab,用最小数量的制表符和空格替换空白字符串以达到相同的间距.使用相同的制表位,比如每n列.应该是变量还是符号参数?"
我遇到的问题是,我不确定如何正确地做到这一点.我知道这不是很解释,但这就是问题所在.我见过的大多数例子都计算了一些空白,用一个标签取代了那些系列,但这并不是它的要求,我认为我理解它的要求,但目前感觉无法做到这一点.
谁能帮忙:)
编辑:到目前为止我写的代码可以在这里找到.
我正在读K&R; 到目前为止,我做得很好,但有一些功能itoa()我不明白.在这里,itoa()他们说他们自己扭转数字.例如10是01(它们反转字符串):
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
return; …Run Code Online (Sandbox Code Playgroud) 练习是:写一个函数setbits(x,p,n,y)返回x,其中n位从位置p开始,设置为y的最右边n位,其他位保持不变.
我尝试解决方案是:
#include <stdio.h>
unsigned setbits(unsigned, int, int, unsigned);
int main(void)
{
printf("%u\n", setbits(256, 4, 2, 255));
return 0;
}
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return (x >> (p + 1 - n)) | (1 << (n & y));
}
Run Code Online (Sandbox Code Playgroud)
这可能不正确,但我在正确的道路上吗?如果没有,我做错了什么?我不确定为什么我不完全理解这一点,但我花了大约一个小时试图想出这个.
谢谢.
我正在用K&R教自己C并且被本书中的一个例子所困扰.我完全按照示例中编写的方式编译代码,但它不会像作者所说的那样做.该程序应该计算字符数.给出的代码如下:
#include <stdio.h>
/* count characters in input; 1st version */
main()
{
long nc;
nc=0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Run Code Online (Sandbox Code Playgroud)
为了编译它我用int main()替换main().但我认为这与问题无关.该程序编译并运行正常.但它根本不计算字符,因为它是写的.我错过了什么吗?自从本书出版以来,现代编译器如何处理代码示例这样的事情会有所改变吗?任何有关此留言板上的好人可能提供的帮助将不胜感激.
最好,丹
在KR C book 112页中,它说:
int (*arr1)[10];
Run Code Online (Sandbox Code Playgroud)
是一个指向10个整数数组的指针.我不知道上面和下面有什么区别:
int arr2[10];
Run Code Online (Sandbox Code Playgroud)
1- arr2本身不是指向10个整数数组的指针吗?(因为数组的名称本身就是指针.)
2-如果数组的名称是阵列地址和指针数组,则两个arr1和arr2是指向整数数组,是不是这样的吗?
我的代码段错误,我不知道为什么.
1 #include <stdio.h>
2
3 void overwrite(char str[], char x) {
4 int i;
5 for (i = 0; str[i] != '\0'; i++)
6 str[i] = x;
7 }
8
9 int main(void) {
10 char *s = "abcde";
11 char x = 'X';
12 overwrite(s, x);
13 printf("%s\n", s);
14 return 0;
15 }
Run Code Online (Sandbox Code Playgroud)
gdb调试器告诉我,问题出在第6行,我想将一个char存储到c-string中(如果我使用左值指针解除引用,那就是同样的问题.)这就是他所说的:
(gdb) run
Starting program: /tmp/x/x
Breakpoint 1, overwrite (str=0x8048500 "abcde", x=88 'X') at x.c:5
5 for (i = 0; str[i] != '\0'; i++) …Run Code Online (Sandbox Code Playgroud) 我正在用C编程语言(K&R)学习C 语言.
由于我不特别想在文本编辑器和运行gcc之间来回跳转,所以我决定使用xcode作为IDE.到目前为止,在第1.5.2节之前,我已经能够顺利地阅读本书的示例.
给定有效(?)程序时......
#include <stdio.h>
void main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Run Code Online (Sandbox Code Playgroud)
...我没有收到最终输出,告诉我输入中有多少个字符.我通过xcode控制台窗口输入我的输入.
经过一些调试,看起来我的程序卡在while循环中,并且永远不会遇到EOF令牌.为了适应这一点,我已经不是取代换行符作为新的条件下,通过更换EOF用"\n",也什么都不做,并给了我一个int值指针比较预警.
我在这做错了什么?
我可以使用xcode关注K&R吗?
我的作业代码中有这个奇怪的函数定义,我真的不知道它应该是什么意思.
char *
sh_single_quote (string)
char *string;
{...}
Run Code Online (Sandbox Code Playgroud)
特别是"char*string;" 一行,最后用分号.
c ×10
kr-c ×10
arrays ×1
binary ×1
c-strings ×1
cstring ×1
definition ×1
function ×1
obfuscation ×1
pointers ×1
types ×1
while-loop ×1
xcode ×1