第四章:谁先爱了,谁就输了(取消代码注释)

描述

    有时候就是这么奇怪,在那天晚上跟陈孝正杠上之前,郑微从来没有听说过,也没有发现过这个人的存在。当然,也许他曾无数次地从她身边擦肩而过,或许也曾有人有意无意地在她面前说起过这个名字,只不过当时的这个人和这个名字对于郑微来说毫无意义,所以她浑然未觉,然而当她开始留意这个家伙,才发现他无所不在。

    本来建筑系和土木系就是一个学院的,彼此关系还算密切,又在同一栋教学楼,简直是抬头不见低头见。而且郑微还惊讶地发现,这家伙居然还小有名气,院里不少人都听说过他,无非是去年高分录取的状元,成绩挺不错,曾在建筑模型设计比赛中获奖之类的。跟阮阮说的大同小异,工程图学的那个老学究也在课堂上提起过他,俨然一副得意门生的口吻,就连卧谈会上她也曾经从黎维娟(郑薇的室友)的嘴里听到过他的名字,一向心高气傲的黎维娟竟然也对他颇为向往。

到底郑薇跟陈孝正是如何杠上的呢?其实是一份C语言程序代码!请把这份C语言代码的注释去除掉。

输入
输入数据中含有一些符合C语言语法的代码行。

输出
输出不含有双斜杠注释的C语言代码,除了注释代码之外,原语句行格式不变,行尾也不应有空格。如果整一行只有注释,那么你应该忽略这一行。

输入样例 1

//======================
// simplest program
//======================
#include<stdio.h>
#include<math.h>
//----------------------
int main(){
    printf("My World!\n");
    return 0;
}//---------------------

输出样例 1

#include<stdio.h>
#include<math.h>
int main(){
    printf("My World!\n");
    return 0;
}

此题需要考虑到正文页可能有“//”,;例如:printf("…//…"),此时这里的//需要输出,如果不是正文中出现的,注释则需要取消。
其次,需要考虑换行问题,这里我用的是puts("");用puts("\0")也可以实现。倘若没有此语句,下一次输入字符串则会出现在同一行,puts("\n")与前两种实现的效果有点不同,可以自行编译进行理解。
同时,我用到了flag与flag1来标记,控制puts("")的输出,来控制光标移动到下一行。

下面是AC代码的具体实现:

#include <stdio.h>
#include <string.h>

int main()
{
    int i,j;
    char a[10000];
    while (gets(a)) //连续输入多个字符串
    {
        int l=strlen(a),flag=0,flag1=0;//flag表示一行中有注释,flag1表示一行中有注释并且有正文
        for (i = 0; i < l; i++)  //遍历输入这一串字符
        {
            if (a[i] == '/'&&a[i + 1] == '/')  //如果这串字符中出现"//",要考虑两种情况
            {                                  //1.可能为注释  2.可能是正文,如:printf("...//...")
                int m = 0, n = 0;   //下面就用判断是否属于正文
                for (j = i; j >= 0; j--)
                    if (a[j] == '"')  //如果出现"//",遍历前面是是否有引号
                        m = 1;
                for (j = i + 2; j < l; j++)  //遍历后面是否有引号
                    if (a[j] == '"')
                        n = 1;
                if (m&&n)  //如果前后都有引号证明是正文
                {
                    printf("/");  //输出引号
                    continue;
                }
                flag = 1;  //只要出现"//"就标记
                if(i>0)
                    flag1 = 1;    //只要不是第一个字符就出现/,那么就标记,如果是后面出现//,可能为注释或正文,前面都必须有其他字符输出
                break;  // 如果出现"//"但又不是正文,则为注释,直接跳出,进行下一个字符串输入
            }
            printf("%c", a[i]);
        }
        if (!flag||flag1)   //如果是正文,输出之后需要让光标移动到下一行再进行输入
            puts("");      //特别注意:这里puts("")实际上是输出一个字符长度为0,由于每个字符串都是以"\0"结束,因此在这里两者是等效的
        if (flag&&!flag1)  //如果是注释,则无需进行以上处理
           continue;
    }
    return 0;
}

希望我的文章可以帮助你更好地理解哦!
如果有什么错误的话,还请批评指正,嘻嘻!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值