• 《C程序设计语言》 练习1-23


    问题描述

      编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套。

      Write a program to remove all comments from a C program. Don't forget to handle quoted strings and character constants properly. C comments do not nest.

    解题思路

    1.我们要知道注释有两种,一种是单行注释(//123456),另一种是多行注释(/*123456*/)

    2.开始进入单行注释的标志是,遇到两个斜杠‘ // ’ , 结束标志是换行 ' '

    3.开始进入多行注释的标志是,遇到 ' /* ' ,  结束标志是  ' */ '

    4.所以我们设置一个变量来判断字符在注释内还是注释外,注释内不输出,注释外输出

    5.如果出现这种语句:

    printf("注释语句为/*123456*/");
    

      双引号内的内容是要打印的,要输出

    6.所以我们要保证,在判断注释语句的标志时,字符不在双引号内

    代码实现

     1 #include<stdio.h>
     2 #define MAXLEN 1024
     3 
     4 int getlines(int array[] , int maxlen);//将输入读入数组
     5 
     6 int main()
     7 {
     8     int array[MAXLEN];
     9     int len;
    10     int i=0;
    11     int in_quote=0;//判断是否在引用内
    12     int in_commentm=0;//判断是否在多行注释内
    13     int in_comment;//判断是否在单行注释内
    14     while ((len = getlines(array , MAXLEN)) > 0)
    15     {
    16         while(i < len)
    17         {
    18             if (array[i]=='"')
    19             {
    20                 in_quote = 1;
    21             }
    22             if (in_quote==1 && array[i]=='"')
    23             {
    24                 in_quote = 0;
    25             }
    26             
    27             if (in_quote==0)
    28             {
    29                 if (array[i] == '/' && array[i+1] == '*')
    30                 {
    31                     i = i+2;
    32                     in_commentm = 1;
    33                 }
    34                 if (array[i] == '/' && array[i+1] == '/')
    35                 {
    36                     i = i+2;
    37                     in_comment = 1;
    38                 }
    39                 if (array[i]=='
    ')
    40                 {
    41                     in_comment = 0;
    42                 }
    43                 
    44                 
    45                 if (array[i] == '*' && array[i+1] == '/')
    46                 {
    47                     i = i+2;
    48                     in_commentm = 0;
    49                 }
    50                 if (in_commentm==1 || in_comment==1)//注释内的字符全部略过,不输出
    51                 {
    52                     i++;
    53                 }else
    54                 {
    55                     printf("%c",array[i]);
    56                     i++;
    57                 }
    58             }else
    59             {
    60                 printf("%c",array[i]);
    61                 i++;
    62             }
    63         }
    64         i = 0;
    65     }
    66     return 0;
    67 }
    68 
    69 
    70 int getlines(int array[] , int maxlen)
    71 {
    72     int c,i;
    73     for ( i = 0; i < maxlen-1 && (c=getchar())!=EOF; i++)
    74     {
    75         array[i] = c;
    76     }
    77     array[i] = '';
    78     return i;
    79 }

    运行结果

  • 相关阅读:
    HDU 4893 线段树
    Catalan数推导(转载)
    URAL 1992
    小乐乐吃糖豆
    排列组合问题总结
    G
    F
    C
    D
    B
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/12830281.html
Copyright © 2020-2023  润新知