关闭

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

292人阅读 评论(0) 收藏 举报
分类:

编程中要处理好各种特殊情形,不明确存在哪些特殊情形时,可以从最简单情形开始。以下代码存在不当之处,先不管它,先测试,再考虑特殊情形调整。第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外输出,需要存储字符一次性输出。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36985次
    • 积分:1018
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:0篇
    • 译文:0篇
    • 评论:11条
    最新评论