练习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外输出,需要存储字符一次性输出。

编写一个删除C语言程序中所有注释语句,正确处理带引号的字符串与字符常量

//这是书上的例题,//后面的内容不能删除  字符串内的/**/能正常打印 #include void rcomment(int c); void in_comment(void); void e...
  • u012323667
  • u012323667
  • 2016年08月31日 15:03
  • 698

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

状态机编程思想 @Link: http://www.cnblogs.com/zhanghaiba/p/3569928.html http://blog.csdn.net/yuezhiren/art...
  • qq_34479062
  • qq_34479062
  • 2017年07月15日 11:41
  • 322

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

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

编写一个删除c语言中的注释语句/* */的程序

//编写一个删除c语言中所有的注释语句 /****************************************************** "Write a program to re...
  • zhangchao3322218
  • zhangchao3322218
  • 2011年09月14日 11:39
  • 2909

删除C语言程序中所以的注释语句(有疑问)

     源自《The C Programming Language》P25 p1-23:     编写一个删除C语言程序中所以的注释语句。要正确处理带引号的字符串和字符常量。在C语言中,注释不允许嵌...
  • roma823
  • roma823
  • 2011年04月26日 17:21
  • 3971

删除C程序中注释语句

最近在看《C程序设计语言》,发现真是一本好书。后悔当初学C的时候教材为什么不是这本书而是乔林和老谭呢?看了一会才发现,这本书不适合刚入门的C初学者。学过C之后再看这本书,会发现一些处理的细节和编程的规...
  • feidewu
  • feidewu
  • 2012年11月21日 22:17
  • 1888

编写一个删除C语言程序中所有注释语句的程序

#include void rcomment (int c); void in_comment_one (void); //该函数用于处理/*及*/的注释符 void in_comment_two...
  • talent_CYJ
  • talent_CYJ
  • 2016年06月27日 17:48
  • 3717

编写一个删除C语言源程序中的所有注释语句,要正确处理带引号的字符串和字符常量。

#include #define MAXLINE 1000 /* max input line size */ char line[MAXLINE]; /*current input line*/in...
  • lizhidefengzi
  • lizhidefengzi
  • 2016年11月23日 00:29
  • 675

C语言实验——图形输出(字符常量练习)

Time Limit: 1000MS Memory Limit: 65536KB Problem Description 用基本输出语句打印以下图形: # ## ### #### ###...
  • ken_black
  • ken_black
  • 2016年11月27日 13:28
  • 644

删除C语言程序中所有的注释语句(有疑问)

[cpp] view plain copy #include       void rcomment(int c);   void in_comment();   void echo_q...
  • maoshanbo
  • maoshanbo
  • 2017年06月24日 22:30
  • 79
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:练习1-23 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量
举报原因:
原因补充:

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