练习1-23 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量

原创 2016年06月01日 16:00:05

编程中要处理好各种特殊情形,不明确存在哪些特殊情形时,可以从最简单情形开始。以下代码存在不当之处,先不管它,先测试,再考虑特殊情形调整。第1章题意经常读不清楚。

#include <stdio.h>
#define MAXCHAR 10000

char line[MAXCHAR];
int pos;

int detnote(int pos);

main()
{
    int i,c;
    for(pos=0;(c=getchar())!=EOF;++pos){
        if(c!='/')
            line[pos]=c;
        else
            pos=detnote(pos);
    }
    for(i=0;i<=pos;++i){
        putchar(line[i]);
    }
}

int detnote(int pos)
{
    int c;

    if((c=getchar())=='*'){
        for( ;(c=getchar())!='*'; )
         ;
        if((c=getchar())=='/')
            return pos-1;

    }
    else{
        line[pos]='/';
        ++pos;
        line[pos]=c;

    }
    return pos;
}

正确处理带引号字符串与字符常量什么意思?从答案代码来看,是要防止把双引号里字符串误当注释删掉:

input:  abc"/*abc*/"
output: abc""

规范注释方式是/* abc */,答案代码不把//当成注释符。答案代码:

#include <stdio.h>
void rcomment(int c);
void in_comment();
void echo_quote(int c);

main()
{
    int c;
    while((c=getchar())!=EOF){
        rcomment(c);
    }
}

void rcomment(int c)
{
    int d;
    if(c=='/'){
        if((d=getchar())=='*'){
            in_comment();
        }
        else if(d=='/'){
            putchar(c);
            rcomment(d);
        }
        else{
            putchar(c);
            putchar(d);
        }

    }
    else if(c=='\'' || c=='"'){
        echo_quote(c);
    }
    else
        putchar(c);
}

void in_comment()
{
    int c,d;
    c=getchar();
    d=getchar();
    while(c!='*'||d!='/'){
        c=d;
        d=getchar();
    }
}

void echo_quote(int c)
{
    int d;
    putchar(c);
    while((d=getchar())!=c){
        putchar(d);
    }
    putchar(d);
}

总结什么时候使用函数,什么时候使用递归。特殊情形测试:

input:  abc"efg\"hi/*jkl*/mn"
output: abc"efg\"himn"

函数echo_quote中while里putchar(d)后补上,防止误把转义字符的引号(\’或\”)当成结束标志:

        if(d=='\\')
            putchar(getchar());

其实答案还有bug,如下,且in_comment里while陷入死循环。假设注释规范,就没问题。

input:  abc/*abc
output: abc

还有一个问题,输入一行立即输出,如何才能全部输入后(多行)再输出?练习1-14输入多行需要Ctrl+Z才开始输出的。在while外输出,需要存储字符一次性输出。

练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个空格之后

MAXCOL=10,pos取值:012345678901234567890123456789main中else if(++pos>=MAXCOL)既赋值又判断。#include #define MA...

【C语言】验证花括号成对出现

题目要求 编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。 注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。 算法分析 我们先判断左花括号的数量是否...

【1-23】编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再c语言中,注释不允许嵌套。

状态机编程思想 @Link: http://www.cnblogs.com/zhanghaiba/p/3569928.html http://blog.csdn.net/yuezhiren/art...

练习6.1 上述getword函数不能正确处理下划线、字符串常量、注释及预处理器控制指令。请编写一个更完整的getword函数

函数getword,形参word与变量重名,既是输入也是输出,相似的还可见第114页struct point addpoint中的p1。这里写代码片...

C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句

本程序运行后,将要求用户输入一个当前目录下的C源码程序文件名,读取后,将文件中的所有注释删除掉,然后另存为*_noc.ext文件,*中可以包含多个点,.ext可以为空(即没有文件扩展名)。...
  • ycjnx
  • ycjnx
  • 2017年06月23日 16:54
  • 511

【K&R 习题 1-23】删除C/C++语言中的程序中的所有注释语句

原题: 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再C语言中,注释不允许嵌套。         题目的目的是要做一个简单的语法分析器,所使用的工具为状态机。...

struts2中用OGNL表达式定义字符串常量与单个字符常量需要注意的一个小细节

具体记录如下: 注意上面红色部分的标识。当定义的变量为单个字符是,必须外面是单引号,字符用双引号引起。 附:转载OGNL表达式相关的知识点: OGNL的全称是O...
  • Alsyuan
  • Alsyuan
  • 2017年06月14日 22:11
  • 213

第7周 C语言程序设计(新2版) 练习1-19 颠倒字符串中的字符

问题及代码: /*将输入字符串s中的字符颠倒过来*/ #include #define MAXLINE 1000 int getline(char line[],int maxline);...

杂杂的基础知识【Sizeof与Strlen&strcpy和memcpy&字符串常量和字符常量】

呃呃呃好多基础知识忘的都差不多了,再瞅瞅,顺便记录一下今天都学了什么 对对,今天上午还看了下接口测试那面,哎哟~要继续努力呢 Sizeof与Strlen的区别与联系 一、sizeof     ...

堆、栈、程序区、静态数据区、字符常量区的介绍与区别

自己总结一下关于内存分区的基础知识:         先上图:     在VS测试中发现,字符常量区(只读数据区)在编译时候与静态数据区放在了一起。因此在静态数据区的几种类型没有独立的地址...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:练习1-23 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量
举报原因:
原因补充:

(最多只允许输入30个字)