| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5337 人关注过本帖
标题:删除C源文件中的所有注释
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
已结贴  问题点数:20 回复次数:9 
删除C源文件中的所有注释
C程序设计语言第一章的第23题。
题目:
     删除C语言程序中所有的注释语句。

但是怎么判断//和/*是不是字符串中的一部分?

悲剧……依旧不完善。

程序代码:
/*无法检测//以及/*是不是字符串的一部分。*/ 
#include <stdio.h>
#include <stdlib.h>
#define STAR '*'
#define SLASH '/'
#define ENTER '\n'
#define QUOTE '\"'
#define MAXLINE 1000
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; i++)
       s[i] ='\0';

    for(i = 0; i < size - 1 &&  (c = fgetc(fp)) != EOF && c != ENTER; i++)
        s[i] = c;
    if(c == ENTER)
        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] == QUOTE)//将双引号到下一个双引号或回车间的字符存入数组。PS,假设该C源程序不存在语法错误。
        {
           s[j++] = s[i++];
           while(s[i] != QUOTE)
              s[j++] = s[i++];
           s[j++] = s[i];
        }
        else if(s[i] == SLASH && s[i+1] == STAR)//跳过斜杠+星号到星号+斜杠之间的字符。 
        {
            i += 2;//跳过斜杠+星号 
            while(s[i] != STAR && s[i + 1] != SLASH)
                i++;
            i += 2;//跳过星号+斜杠 
        }
        else if(s[i] == SLASH && s[i+1] == SLASH ) //跳过双斜杠至回车之间的字符。 
        {
            i += 2;
            while(s[i] != ENTER)
                i++;
        }
        else if(s[i] != ENTER) 
            s[j++] = s[i];
    }
    if(s[i-1] == ENTER)//s[i]为'\0',检查s[i-1]是不是回车,如果是则加上 
       s[j++] = ENTER;
    s[j] = '\0';
}


[此贴子已经被作者于2017-2-8 14:47编辑过]

搜索更多相关主题的帖子: C程序设计 源文件 字符串 C语言 
2017-02-08 09:06
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:10 
碰到""就直接跳过
2017-02-08 09:12
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 grmmylbs
遇到双引号或单引号,就直接跳过下一个双引号的位置?



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


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-08 10:16
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
回复 3楼 renkejun1942
在非注释里面碰到"里面的东西就可以不管,直接找到下一个"
在非"  //里面遇到'/n'就代表注释结束~
在非"  /*里面要遇到*/才表示注释结束~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-08 10:57
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 九转星河
你说的这三个都已经实现了。
嗯……刚才我在另一个问题上纠结,然后我才发现我纠结了半天的东西实际上是错误的,在一个正常的C程序中根本不会出现。

比如这样一个字符串 ,"fsadgsagasga\*ghagadg"
但是如果换行了怎么办?比如这样:
"fsadgsagasga
\*ghagadg"

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-08 11:06
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
测试用例:
int main(int argc, char* argv[])
{

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

*/
    printf("\"/*a=%d",a);printf("\"*/");return 0;
    return 0;
}
2017-02-08 13:43
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分: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;
}
2017-02-08 13:47
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 6楼 ICU
程序还有问题,这种情况没考虑到,悲剧…………

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-08 14:43
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-08 14:47
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
好的,持续关注
2017-02-08 14:57
快速回复:删除C源文件中的所有注释
数据加载中...
 
   



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

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