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



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

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