sir上面确实高人多.不过最近貌似不是很热心了.可能问题对他们来说比较简单的缘故.
现在还是回到程序本身.
#include <stdio.h> int main(void) { char c1, c2, c3; int i; float x; double y; printf("\n%s\n%s", "Input three characters,"//<-请注意这里.是不是应该这个样子的"characters", "an int, a float, and a double: "); scanf("%c%c%c%d%f%lf", &c1, &c2, &c3, &i, &x, &y); printf("\nHere is the data that you typed in:\n"); printf("%3c%3c%3c%5d%17e%17e\n\n", c1, c2, c3, i, x, y); return 0; }
虽然问题出现的情况现在看来简直就是吐血.但是还是值得学习的.首先
printf的控制字符串表示了格式为输出2个字符串,并且有回行.但是如果按照原文写的.就表明只有一个字符串了,因为参数之间应该是用逗号来分割.
现在再来说明为什么会出现段错误(core dumped).再上一篇中讲到,段错误是由于访问了不存在或者被保护的内存地址.那么在这里就完全说的通了.因为控制字符串表明了要输出2个字符串,那么系统应该是准备了2个地址开始写,但是实际参数只有一个.那么当写完第一个参数以后.第二个参数就应该是为(null).
引用前文:
"......在打印字符串的时候,实际上是打印某个地址开始的所有字符,但是当你想把整数当字符串打印的时候,这个整数被当成了一个地 址,然后printf从这个地址开始去打印字符,指导某个位置上的值为\0。所以,如果这个整数代表的地址不存在或者不可访问,自然也是访问了不该访问的 内存——segmentation fault。"
很显然,当发现没有第二个参数,即访问不到要打印的地址时候,报错了~~
呵呵..看似很简单的问题,原来也这么深奥.顿时感觉和打星际似的.有时候也冒出,这也不是不可能的想法..
--------------------------------------------------------------
在写printf时候.用的方法和我们最初所学习的老谭的书很不同.
暂且不论是否花俏.
在和一个朋友经过QQ讨论后发现.有科学的地方可取..
比如在某个程序中需要大量输出同一个字符串.那么现在我用一个小小的程序来说明下为什么写成那样更科学方便:
#include<stdio.h> #define casio "I like C programming" int main(void) { printf("casio\n %s\n%s\n" ,casio ,"casio"); return 0; }
//国内的很多程序都不加int返回值.并且结尾也不加return 0; 我认为很大程度上是由于微 //软的纵容.再次说下.main只有2总写法,一种是那个,另一个是:int main( int argc, //char *argv[] )
在输出后得到的是
casio
I like C programming
casio
显然,双引号的casio没有被define.那么.如果采用printf("字符串");的方式来写.一旦要进行修改的话.要么需要很庞大的修改量.要么.你选择工具进行批操作.当然.你最好确定你写的正则不会对其他地方进行误修改.