看书摘要:c语言常见问题集【2】

呵呵,没想到这么快就看完了。昨晚写完了前20条,后来寝室熄灯了。悲剧。。。。

没想到今天还真的没关闹钟,准时起床了一次。到现在总结了自己觉得适合现在的水平的11条。就这31条吧,作为自己对这本书的纪念。呵呵,我可不想天天背着100多页的A4到处跑。。。

提前回校了,后几天准备看两本arduino书,作为对arduino的一个认识和了解。完了就开始买芯片准备做mwc飞控了。

%%%----------------------------------------------------------------------%%%

1.如下代码有何问题:char c; while( (c==getchar() ) != EOF )......

第一,保存getchar的返回值必须是int型。Getchar可能返回任何字符值,包括EOF。如果把getchar的返回值截为char型,则正常的字符可能被截为错误地生成EOF,或者EOF有可能被修改(尤其是char型为无符号的时候)。

2.为什么char s[30]; scanf("%s",s)也行?

需要指针;并不表示一定需要&操作符。当你向scanf传入一个指针的时候,你不需要是用&。因为不论是否带&操作符,数组总是以指针形式传入参数的。

3.怎样把数字转为字符串,与atoi相反,有itoa函数吗?

用sprintf就可以了,不需担心sprintf小题大做。也不必担心会浪费运行时间和代码空间。

4.一个float变量赋值为3.1时,为什么printf输出的值为3.0999999.

大多数电脑都是用二进制来表示浮点和整数的。在十进制里,0.1是个简单、精确的小数。但是用二进制表示起来却是个循环小数0.0001100110011....所以3.1在十进制内可以准确地表达,而在二进制里却不行。

在对一些二进制中无法精确表示的小数进行赋值或读入再输出时,也就是从十进制转成二进制再转回十进制,会得到一个不同的近似数值。

5.怎样取整数?

对于正负数通用的代码:(int)(  x<0 ? X-0.5 : x+0.5 )

6.为什么如下代码会崩溃:char *p = "hello,world!"; p[0] = 'H'; 

字符串实字并不总是可以修改的,除非时用在字符数组的初始化。试用:char a[] = "helloc,world!".

7.segmentation violation,bus erro,general protection fault错误提示意味什么?

通常这说明你的程序试图访问不该访问的内存地址,一般是由于堆栈出错或是不正确的使用指针。可能的原因有:局部数组溢出;用了空指针;未初始化指针、地址及未对齐的指针或其他没有适当分配的指针;malloc内部被破坏;函数调用参数不匹配。

8.怎样表示一个百分比的进展表示器?

输出字符‘\r’通常可以得到一个回车而没有换行,这样可以复写当前行。字符'\b'代表退格,通常会使光标左移一格。记住要调用fflush().

9.怎样在一个c程序中调用另一个程序(独立可执行的,或系统命令)?

使用库函数system()。系统返回的值最多是命令的退出状态值(但这并不是一定的)。通常和命令的输出无关。还要注意system()只接受一个单独的表述调用程序的字符串作为参数。如果你要建立复杂的命令行可以使用sprintf()。

10.assert()是什么,怎样使用它?

这是个定义在<assert.h>内的宏。用来测试断言。一个断言本质上是写下程序员的假设,如果假设被违反,那表示有个严重的程序错误。例如一个假设只接受非空指针的函数,可以写assert(p != NULL); 一个失败的断言会中断程序,断言不应该用来捕捉意料中的错误。例如malloc(),fopen().

11.由一个日期怎样知道星期几?

用mktime(),localtime()。或者下面这段优美的代码。

Int dayofweek(int y, int m, int d)

{

Static int t[] = {0,3,2,5,0,3,5,1,4,6,2,4};

Y -= m < 3;

Return(y + y/4 - y/100 + y/400 + t[m-1] + d)%7;

}

你可能感兴趣的:(c)