| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2769 人关注过本帖
标题:修改后:删除C源文件注释
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
已结贴  问题点数:20 回复次数:22 
修改后:删除C源文件注释
感谢 ICU 提醒我昨天的程序有严重BUG。

修改之后,用ICU的例子做了测试,完美删除注释,测试的比较少,不排除依旧存在BUG。

程序代码:
/*删除C源代码中的注释
PS:注释不允许嵌套*/ 
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 100000
int getline(char s[], int size, FILE * fp);
void del_annotation(char s[]);

int main(void)
{
    char line[MAXLINE];
    int i;
    FILE *p_file_r, *p_file_w;

    if((p_file_r = fopen("words.txt","r")) == NULL)//测试文件 
    {
        fprintf(stderr,"无法打开读取文件");
        exit(EXIT_FAILURE);
    }

    if((p_file_w = fopen("word1.txt","w")) == NULL)//测试文件 
    {
        fprintf(stderr,"无法打开写入文件");
        exit(EXIT_FAILURE);
    }

    while((i = getline(line,MAXLINE,p_file_r)) > 0)
    {
        del_annotation(line);
        fprintf(p_file_w,"%s",line);//将跳过所有注释的字符串写入新的文本。 
    }

    fclose(p_file_r);
    fclose(p_file_w);
    printf("Bye!\n");
    return 0;
}

int getline(char s[], int size,FILE * fp)// 
{
    int i,c;

    for(i = 0; i < size - 1 &&  (c = fgetc(fp)) != EOF; i++)
        s[i] = c;
    s[i] = '\0';

    return i;
}

void del_annotation(char s[])//删除C源文件中的注释; 
{
    int i,j;

    for(i = 0, j = 0; s[i] != '\0'; i++)
    {
        if(s[i] == '/')
        {
            if(s[i+1] == '*')
            {
                i += 2;
                while(s[i] != '*' || s[i + 1] != '/')
                    i++;
                i += 2;
                if(s[i] == '/')
                {
                   i--;
                   continue;
                }
            }
            else if(s[i+1] == '/')
                while(s[i] != '\n')
                    i++;
        }
        else if(s[i] == '\"' || s[i] == '\'')
        {
           char x = s[i];
           while(s[j++] = s[i++] , s[i] != x && s[i] != '\0')
               if(s[i] == '\\') 
                   s[j++] = s[i++];
        }
        s[j++] = s[i];
    }
    s[j] = '\0';
}




程序代码:
//测试用例1:
int main(int argc, char* argv[])
{

/*
///*/int a=1;/*

*/
    printf("\"/*a=%d",a);printf("\"*/");return 0;
    return 0;
}


程序代码:
//删除之后
int main(int argc, char* argv[])
{

int a=1;
    printf("\"/*a=%d",a);printf("\"*/");return 0;
    return 0;
}


程序代码:
//测试用例2:
int main(int argc, char* argv[])
{

/*
///*/int a=1;/*

*/
    char ch[]="\
/*/*abcdef\
ghijk*/";
    printf("\"/*a=%d\n",a);printf("\"ch=%s*/",ch);return 0;
    return 0;
}


程序代码:
//删除之后
int main(int argc, char* argv[])
{

int a=1;
    char ch[]="\
/*/*abcdef\
ghijk*/";
    printf("\"/*a=%d\n",a);printf("\"ch=%s*/",ch);return 0;
    return 0;
}


程序代码:
//测试用例3:
int main(void)
{
    char line[MAXLINE];
    int i;
    FILE *p_file_r, *p_file_w;/*fsaghgdagsdhkfhsadiglhsaildghsaglikhsa*/
/*fsadhgsi
aoghsai
guyhsaighs
aigsaiug
yhwe8iu4gyhs
eiegvsdk
jghbnksla*/
    if((p_file_r = fopen("words.txt","r")) == NULL)//测试文件 
/*gfsdgusaoighujsaiog
gjsdiaghsaighsai
gjsdkaghsadikgl
ghskadghsakgh*/*/
    {
        fprintf(stderr,"无法打开读取文件");
        exit(EXIT_FAILURE);
    }

    if((p_file_w = fopen("word1.txt","w")) == NULL)//测试文件 
    {
        fprintf(stderr,"无法打开写入文件");
        exit(EXIT_FAILURE);
    }

    while((i = getline(line,MAXLINE,p_file_r)) > 0)
    {
        del_annotation(line);
        fprintf(p_file_w,"%s",line);//将跳过所有注释的字符串写入新的文本。 
    }

    fclose(p_file_r);
    fclose(p_file_w);
    printf("Bye!\n");
    return 0;
}


程序代码:
//删除之后
int main(void)
{
    char line[MAXLINE];
    int i;
    FILE *p_file_r, *p_file_w;

    if((p_file_r = fopen("words.txt","r")) == NULL)

    {
        fprintf(stderr,"无法打开读取文件");
        exit(EXIT_FAILURE);
    }

    if((p_file_w = fopen("word1.txt","w")) == NULL)
    {
        fprintf(stderr,"无法打开写入文件");
        exit(EXIT_FAILURE);
    }

    while((i = getline(line,MAXLINE,p_file_r)) > 0)
    {
        del_annotation(line);
        fprintf(p_file_w,"%s",line);
    }

    fclose(p_file_r);
    fclose(p_file_w);
    printf("Bye!\n");
    return 0;
}


[此贴子已经被作者于2017-2-10 08:01编辑过]

搜索更多相关主题的帖子: 源代码 源文件 color 
2017-02-09 10:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:7 
如果程序是能正常编译的,那应该没有什么问题,但如果那个程序代码本来就编译错误的,我只能说,呵呵了~~~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-09 10:52
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 九转星河
不太明白。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 11:09
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:7 
楼主,不能用检测;判断字符串结束,否则在字符串中加入;会导致误判
测试用例2.1:
// s.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
/*
///*/int a=1;/*

*/
    char ch[]="\
/*;/*abcdef\
ghijk*/";
    printf("\"/*a=%d\n",a);printf("\"ch=%s*/",ch);
    return 0;
}
2017-02-09 11:11
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 ICU
这不是判断的问题,那是读取字符串的问题,因为读取是到分号作为结束。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 11:24
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 ICU
    char ch[]="\
/*;/*abcdef\
ghijk*/";
这里在读取的时候被分成了两个字符串。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 11:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 renkejun1942
编译不通过的代码错误可以天马行空~要考虑的情况多得去了~判断是否为注释需要考虑的东西要多很多~而且这样意义又不大了~我猜题目要求应该建立在能通过编译的程序下~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-09 11:29
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 ICU
其实昨天的程序已经没有太大的问题。

所有的问题都是出在读取这里,是以分号为一条语句的结束?还是以回车?无论是哪一种,都会存在问题。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 11:31
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 7楼 九转星河
ICU提供的测试代码是可以通过编译的,我测试过,否则我不会再考虑修改。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 11:32
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉读取和判断应该是要分开进行的,单独一句判断是否为注释这样会出问题。

试试不用把每一条语句用分号分开,先一次性读取全部,然后再进行判断是否为注释内容~


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-09 12:06
快速回复:修改后:删除C源文件注释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032279 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved