c语言中的输入输出编的程序不能显示输出是那里出的问题?

《C语言程序设计》基本知识点解答_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
12页免费18页免费14页免费8页1下载券10页1下载券 8页1下载券6页2下载券26页1下载券67页1下载券3页2下载券
《C语言程序设计》基本知识点解答|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢C语言的输出格式&&与&&嵌入式C常见问题
C语言的输出格式&
与& 嵌入式C常见问题
★d格式符,用来输出十进制整数.
⑴ %d,, 按整型数据的实际长度输出.
⑵%md,&
m为指定的输出字段的宽度,数据位数小于m,左边补空格,若大于m,按实际长度输出(打个比方 printf("%3d",a);
如果a =1,&& 输出就是
如果a =12,& 输出就是 _12
如果a =123, 输出就是 123
如果a =1234,输出就是 1234
"_"表示空格
m表示的就是输出的最小长度,不到的就补空格
同理还有printf("%03d",a);补的就是0
如果a =1,&& 输出就是 001
如果a =12,& 输出就是 012
如果a =123, 输出就是 123
如果a =1234,输出就是 1234
&⑶ %ld, 输出长整型数据(long)
★o格式符,以八进制输出整数(不带符号,他将符号位也作为八进制数的一部分了)
&&&&&&&&&&&&&&&
⑴%o,参考%d的解释.
&&&&&&&&&&&&&&&
⑵%lo,参考%ld的解释.(长整形的8进制数)
&&&&&&&&&&&&&&&
⑶%mo,参考%md的解释.
★x,X格式符,以十六进制输出整数
&&&&&&&&&&&&&&&
也是3种参考%d的解释.
★u格式符,用来将unsigned型数据,既无符号数,以十进制形式输出
&(%lu ,为长整型的无符号数)
★c格式符,输出一个字符.
★s格式符,输出一个字符串.
&&&&&&&&&&&&&&&
⑴%s,如printf("%s","CHINA")
&&&&&&&&&&&&&&&
⑵%ms,输出的字符串占m列,字符串长度小于m,左边补空格,如果超出则全部输出.
&&&&&&&&&&&&&&&
⑶%-ms,串小于m,则在m列范围内字符串左靠,右补空格.
&&&&&&&&&&&&&&&&&&&
⑷%m.ns,输出占m列,但只取字符串左端n个字符.这n个字符输出在m列的右边,然后左边补空格.
&&&&&&&&&&&&&&&
⑸%-m.ns,和上面的放下,就是n个字符输出在m列的左侧,右边补空格.n&m,那么m自动取n的值,既保证n个字符正常输出.
&&&&&&&&&&&&&&&
printf("%3s,%7.2s,%.4s,%-5.3s
","CHINA","CHINA","CHINA","CHINA");
★f格式符,用来输出实数,以小数形式输出.
&&&&&&&&&&&&&&&
⑴%f,全部输出,而且输出6位小数.
&&&&&&&&&&&&&&&
⑵%m.nf,输出数据共占m列,n位小数,如果数据长度小于m那么左边补空格(注意这里要四舍五入)
&&&&&&&&&&&&&&&
⑶%-m.nf,和上面的m.nf相反,为左靠齐,右补空格.
★e,E格式符,以指数形式输出实数
&&&&&&&&&&&&&&&
⑴%e,不指定输出数据所占的宽度和数字部分的小数位数.
&&&&&&&&&&&&&&&
⑵%m.ne和%-m.ne,这里n指小数部分的位数
★g,G格式符,用来输出实数,它根据数值大小,自动选择f格式还是e格式,(选占宽最少的一种),且不输出无意义的0.这种格式用的不多
预处理器(Preprocessor)
1 . 用预处理指令#define
声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
2 . 写一个 “标准” 宏MIN
,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) &= (B) ? (A) :
这个测试是为下面的目的而设的:
标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
懂得在宏中小心地把参数用括号括起来。 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least
= MIN(*p++, b);
3. 预处理器标识#error的目的是什么?
如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
&&#&&&&&&&&&&
空指令,无任何效果
#include&&&
包含一个源代码文件
#define&&&&
&#undef&&&
取消已定义的宏
#error&&&&&
停止编译并显示错误信息
死循环(Infinite loops)
4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
这个问题用几个解决方案。我首选的方案是:
一些程序员更喜欢如下方案:
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。
第三个方案是用 goto
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。
数据声明(Data declarations)
5. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to
integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes
an integer as an argument and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten
pointers to functions that take an integer argument and return an
integer )
a) // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an
integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that
take an integer argument and return an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?
6. 关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
A、 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
B、在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
C、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
7.关键字const有什么含意?
我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan
Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems
Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)
如果应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?
%a是一个常整型数
%a是一个常整型数
const int *a;&&
%a是一个指向常整型数的指针(整型数是不可修改的,但指针可以)
%a是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的
int const * %a是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的
如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字
const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
8. 关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
一个参数既可以是const还可以是volatile吗?解释为什么。
一个指针可以是volatile 吗?解释为什么。
下面的函数有什么错误:
int square(volatile int *ptr)
return *ptr * *
下面是答案:
是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
return a *
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
return a *
位操作(Bit manipulation)
嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit
3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应不知道如何下手。该被面者从没做过任何嵌入式系统的工作。 用bit fields。Bit
fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到
Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit
fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。用 #defines 和
bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:
#define BIT3 (0x1 && 3)
void set_bit3(void) {
a |= BIT3;
void clear_bit3(void) {
a &= ~BIT3;
一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。
访问固定的内存位置(Accessing fixed memory locations)
嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is:
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。
中断(Interrupts)
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字
__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double
double area = PI * radius *
printf("\nArea = %f", area);
这个函数有太多的错误了,以至让人不知从何说起了:
•; ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
•; ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
代码例子(Code examples)
12 . 下面的代码输出是什么,为什么?
void foo(void)
unsigned int a = 6;
int b = -20;
(a+b & 6) ? puts("& 6") :
puts("&= 6");
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是
”&6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。
13. 评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;
这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。
到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧…
动态内存分配(Dynamic memory
allocation)
尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J.
他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
下面的代码片段的输出是什么,为什么?
if ((ptr = (char *)malloc(0)) ==
puts("Got a null pointer");
puts("Got a valid pointer");
这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got
pointer”。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。
15 Typedef
在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义dPS 和 tPS
作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一个扩展为
struct s * p1, p2;
上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。
晦涩的语法
16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
int a = 5, b = 7,
c = a+++b;
这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:
因此, 这段代码持行后a = 6, b = 7, c = 12。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。c语言编程序,输入10个整型数,输出这10个数中出现2次的数_百度知道
c语言编程序,输入10个整型数,输出这10个数中出现2次的数
提问者采纳
m;&#92:%d\10;c语言编程序,输入10个整型数/
for(i=0;检测出现两次的数
if(count==2)printf(&%d&quot,输出这10个数中出现2次的数#include &;);n&n&输入的10个整数为,count=1;i&:\10.h& printf(&%d &void main(){ int i,j;请输入10个整数;10; }
printf(&&#47,);j& int a[10];&#47:\n出现2次的数;;/输入10个整数 for(i=0;10;i&i++) {
scanf(&i++)
/输出刚刚输入的整数
for(i=0,&m);
a[i]=m;n&/i++) {
printf(&i&lt,a[i]);/j++)
if(a[i]==a[j])count++;
count=count-1,a[i]); &#47
提问者评价
其他类似问题
按默认排序
其他2条回答
在找每次两次出现的数就可以输出so邰瀑观鞠攥角紧寿rt(arr) for(int i=1;i&10;i++) {
if(arr[i-1] 很多办法,其中比较简单是排序
用两个数组,一个存数,一个计数,即可
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁2012年C语言程序设计
第2章—第5章总结
第二章&数据类型
Ⅰ.不同进制的整形常量的表示形式{P10}
十进制:由0-9的数字序列组成,数字前可以带正负号;
八进制:以数字0开头,后跟0-7的数字序列组成(如017【8】相当于15【10】);
十六进制:以数字0加字母x(大小写均可)开头,后跟0-9,a-f(大小写均可)的数字序列组成(如0x12【16】)相当于18【10】;
Ⅱ.标准C规定所有变量必须在第一条可执行语句之前定义,否则程序编译时将提示语法错误{P12};
Ⅲ.在为变量赋值时,等号两边的空格不是必需的,增加空格只是为了增强程序的可读性。此外,main函数内的语句统一向后缩进了四个空格,也是为了增强程序的可读性{P12};
Ⅳ.C语言允许在定义变量的同时对变量初始化(为其赋初值),可避免一定错误{P12};
Ⅴ.在一条语句中,可同时定义多个相同类型的变量,多个变量之间用逗号作分隔符(如int&a,b,c;)。若要在定义变量的同时将其初始化为0,则为int&a=0,b=0,c=0;不能写成int&a=b=c=0{P13};&
Ⅶ.C语言中的基本数据类型【signed】(如下表)
数据类型分类
所占字节数/B
基本整形int
短整形short
长整型long
单精度实型float
3.4*10^-38~3.4*10^38
双精度实型double
-1.7*10^-308~1.7*10^308
长双精度实型long&double
-1.2*10^-*10^4932
字符型char
一般而言,double型数据可以接收实型常量的16位有效数字,而float型变量仅能接收实行常量的7位有效数字,超过有效位数之后的数字都是不准确的,编程时会有warning{P21};
Ⅷ.结合性:①左结合(两个操作数的算术运算符,如"x/y*z"表示
"(x/y)*z)",即从左到右先计算x/y的值,再将x/y的值与z的值相乘;
&&&&&&&&&&&②右结合(赋值运算符)(如"a=b==c=0&"等价于"a=(b=(c=0))",执行时是从右到左把最右侧的表达式的值依次赋值给左侧的变量){P19};
第三章&简单的算数运算和表达式
一、求余运算限定参与运算的两个操作数必须为整形,不能对两个实型数据进行求余运算{P25};
二、除一元的取相反数运算符的结合性为右结合之外,其余的运算符均为左结合(即同一优先级的运算符进行混合运算时,按从左到右顺序进行运算){P26};
三、复合的赋值运算:&a+=10&等价于&a=a+10&{P28-29};
四、增1与减1:①前缀(先进行运算后使用变量);②后缀(先使用变量后进行运算){P29};
五、宏常量:#define&标识符(一般用大写字母表示)&字符串(一种编译预处理命令)【如,#define&PI&3.14159】;const常量(语句)【如,const&double&PI=3.14159;】{P33-34};
六、强制类型转换:(类型)表达式{P37};
七、在C语言中不能省略乘号,如&area=sqrt(s(s-a)(s-b)(s-c))【错误】,area=sqrt(s*(s-a)*(s-b)*(s-c))【正确】{P39};
八、当a,b,c被定义成整型变量时,数学公式s=(a+b+c)/2可写成如下形式:s=0.5*(a+b+c),s=1.0/2*(a+b+c),s=(a+b+c)/2.0,s=(float)(a+b+c)/2【正确】;s=1/2*(a+b+c),s=(float)((a+b+c)/2)【错误】{P39};
&&&第四章&键盘输入和屏幕输出
①.字符的输入与输出:putchar()的作用是把一个字符输出到屏幕的当前光标位置。而getchar()的作用是从系统隐含指定的输入设备(即终端键盘)输入一个字符,按回车键表示输入结束,读入的字符会自动被回显到屏幕上{P45};
②.小写英文字母的ASCⅡ码值比相应的大写英文字母的ASCⅡ码值大32(即,char&a,A;A=a-32&){P45};
③.char&&ch&=&getchar();/*从键盘输入一个字符,按回车键输入结束,该字符被存入变量ch中*/【正确】,getchar(ch);【错误】{P46};
④.函数printf()的格式转换说明符,如下表:{P47}
格式转换说明符
输出带符号的十进制整数,正数的符号省略
以无符号的八进制整数形式输出,不输出前导符0
以无符号的十六进制整数形式(小写)输出,不输出前导符0x
以无符号的十六进制整数形式(大写)输出,不输出前导符0x
输出一个字符
输出字符串
以十进制小数形式输出实数(包括单、双精度)
输出百分号(%)
⑤.printf("%c,%d",ch,ch);/*分别输出变量ch中的字符极其ASCⅡ码值*/{P48};
⑥.&函数printf()的格式修饰符,如下表:{P48-49}
格式修饰符
修饰格式符d,x时,用于输出long型数据
修饰格式符f时,用于输出long&double型数据
输出域宽m(m为整数)
指定输出项输出时所占的列数。
若m为正整数,当输出数据宽度小于m时,在域内向右靠齐,左边多余位补空格;当输出数据宽度超过m时,按实际宽度全部输出;若m有前导符0,则左边多余位补0.
若m为负整数,则输出数据在域内向左靠齐
显示精度.n
(n为大于等于0的整数)
精度修饰符位于最小域宽修饰符之后,由一个实心圆点及其后的整数构成。
对于浮点数,用于指定输出的浮点数的小数位数。
对于字符串,用于指定从字符串左侧开始截取的子串字符个数
⑦.函数scanf()的格式转换说明符,如下表:{P50}
格式转换说明符
输入十进制整数
输入八进制整数
输入十六进制整数
输入一个字符,空白字符(包括空格、回车、制表符)也作为有效字符输入
输入字符串,遇到第一个空白字符(包括空格、回车、制表符)时结束
输入实数,以小数或指数形式输入均可
输入一个百分号%
注:%c格式符存在问题的最佳解决办法:scanf("&%c",&a);/*在%c前面加一个空格,将存于缓冲区中的回车符读走*/{P56-57};
⑧.参数地址是由若干变量的地址组成的列表,这些参数之间用逗号分隔{P50};
⑨.函数scanf()的格式修饰符,如下表:{P51}
格式修饰符
加在格式符d,o之前,用于输入long型数据;
加在格式符f,e之前,用于输入double型数据
(正整数)
指定输入数据的宽度(列数),系统自动按此宽度截取所需数据
Scanf()没有精度格式修饰符,即用scanf()输入实型数据不能规定精度
忽略输入修饰符
表示对应的输入项在读入后不赋给相应的变量
注:函数scanf()的格式控制字符串中只能存在格式说明符,不能存在转义字符(如'\n'等)等其他字符{P51};
⑩.常用的转义字符,如下表:{P44}n不是偶数:n%2!=0
回车(不换行)
空字符,通常用作字符串结束标志
水平制表(Tab)
一个双引号
一个反斜线
&&&&&&第五章&选择控制结构
1.n不是偶数:n%2!=0
2.在书写关系运算符(如&=,&=,==,!=等)时,不能在中间加空格,也不能将符号写反,更不能与数学运算符混淆{P67};
3.条件表达式&一般形式:表达式1?表达式2:表达式3(含义:若表达式1的值非0,则该条件表达式的值是表达式2的值,否则是表达式3的值){P70};
4.条件语句在语法上只允许每个分支中放置一条语句,当分支中存在不止一个语句时,注意添加大花括号,构成复合语句{P72};
5.控制计算机生成的随机数的取值范围:
(1)利用求余运算rand()%b将函数rand()生成的随机数变化到0-b-1之间;
(2)利用rand()%b+a运算将随机数的范围平移到[a,a+b-1]之间;
6.Switch语句相当于一系列的if-else语句,被测试的表达式写在关键字switch后面的圆括号中,表达式只能是char或int型。在case后面接着的是常量,常量与case中间至少有一个空格,常量的后面是冒号,常量的类型应与switch后括号内表达式的类型一致{P75}。case本身没有条件判断的功能,程序执行相匹配的case常量后的语句,直到遇到break语句或者右花括号"}"为止{P77};
7.在数学上正确的表达式在C语言的逻辑上不一定总是正确的,如:"fabs(a)&=1&"不等价于"-1&=a&=1",fabs--取绝对值的数学函数,但,"fabs(a)&=1&"等价于"a&=-1&&&&a&=1";再如"变量ch中字符是英文大写字母"不能写成"'A'&=&ch&&='Z'",而应写成"(ch&='A')&&&&(ch&&='Z')"{P81-82};
8.各种运算符之间有优先级,但是,记不住优先级没关系,最好的办法是"将需要先计算的表达式用圆括号括起来"{P82};}

我要回帖

更多关于 c语言中的输入输出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信