casio1374633

导航

 

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("字符串");的方式来写.一旦要进行修改的话.要么需要很庞大的修改量.要么.你选择工具进行批操作.当然.你最好确定你写的正则不会对其他地方进行误修改.

posted on 2013-04-27 20:31  casio1374633  阅读(234)  评论(0编辑  收藏  举报