【The C programming Language】_Second Edition_一段程序引起的联想

编译工具:Code::Blocks
编译器:   GNN GCC Compiler

#include <stdio.h>
main()
{
    int c;
    while((c = getchar())!= EOF)
    {
        putchar(c);
        printf("1");
   }
}

命令窗口红色区域1—Cstudy为输入,按下回车之后执行,红色区域2.....为输出;

/*****getchar和putchar分别是一次读/写一个字符的函数,getchar()函数等待输入直到按回车才结束******/

问题:回车算是一个字符么

       a. 换行输出表明putchar()函数首次运行的时候执行了换行的操作,在后续的执行过程中并未再次换行;

   b.在读/写完毕"Cstudy"最后一个字符y之后,while循环并未中断,而是令起一行,执行循环语句;

    解释:1、回车算作一个输入字符,被读/写;

    解释:2、Other reason;

   c.如果回车不被当做一个输入字符

    解释:1、Cstudy之后隐式存在一字符

       PS:输入Cstudy以字符串的形式存在某缓存区中,并以类似于'\0'(字符串结束符)的形式结尾,编译器将之理解为空字符

   d.在假定C正确的基础上,回车相当于“事件”,是编译器的原因还是getchar() or putchar()函数的原因

    解释:不明;

解释:

   1、根据Cstudy的读/写操作,确定a假设是正确的

   2、针对回车是否被看做字符输入,尝试运行程序,直接回车,下图是程序执行结果

   直接回车之后,程序仅打印一个回车符,表明回车并未做为一个输入字符被getchar()读取??

   3、新问题出现,图一中看到最后换行打印的“1”该如何解释,在“Cstudy”之后是否存在某些隐式字符!!??

 

补充:1、我们应该搞清楚字符常量与仅包含一个字符的字符串之间的区别;'x'与"x“是不同的,前者是一个整数,其值是字母x在机器字符集中对应的数值(内部表示值);后者是一个包含一个字符(即字母x)以及一个结束符'\0'的字符数组;

   2、其他数据类型,比如int数组,是不存在结束符的概念的;

   3、内存中字符是连续存储的,如果不加结束符,程序无法判定某字符串长度;这可能会导至某些不可预见的问题,例如下面示例:

#include <stdio.h>
main()
{
    char data[5] = {'a','b','c','d','e'};
    char c;
    char time[10];
    sprintf(time,"%s",data);
    printf("%s",time);
}

定义了字符数组data,如果初始化分配空间足够,运行时候会自动在字符数组末尾添加'\0',而在这里仅为'a','b','c','d','e'分配了空间5,没有为结束符'\0'预留空间,程序运行出现”乱码“,如图所示,将data[5]改成data[6],则显示正常。

  4、字符常量一般用于与其他字符进行比较,但也可以像其他整数一样参与数值运算;

转载于:https://www.cnblogs.com/2011201489-zgm/archive/2012/10/10/2718001.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值