C语言之注释转换

简单操作:将以下注释全部转为c++注释风格
例如:

//1.一般情况  
int num = 0;  
/*int i = 0;*/  

//2.换行问题  
/*int i = 0;*/int j = 0;  
/*int i = 0;*/  
int j = 0;  

//3.匹配问题  
/*int i = 0;/*xxxxx*/  

//4.多行注释问题  
/*  
int i = 0; 
int j = 0;  
int k = 0;  
*/int k = 0;  

//5.连续注释问题  
/**//**/  

//6.连续的**/问题  
/**/  

//7.C++注释问题  
// /*xxxxxxxxx*/  

可用有限状态机解决该问题:
这里写图片描述

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>


typedef enum State {
    NOT_COMMENT,    // 不是注释
    MAYBE_IN,       // 可能进注释
    C_COMMENT,      // C 风格
    CPP_COMMENT,    // C++ 风格
    MAYBE_OUT       // 可能出注释(C)
}   State;


int main()
{
    FILE *pIn;
    FILE *pOut;
    int ch, nextCh;
    State state = NOT_COMMENT;
    const char *stateStr[] = {
        "不是注释", "可能进注释", "C 风格",
        "C++ 风格", "可能出注释(C)"
    };

    pIn = fopen("input.c", "r");
    if (pIn == NULL) {
        perror("");
        system("pause");
        return 1;
    }

    pOut = fopen("output.c", "w");
    if (pOut == NULL) {
        perror("");
        system("pause");
        fclose(pIn);
        return 1;
    }

    while (1) {

        ch = fgetc(pIn);
        if (ch == EOF) {
            break;
        }

        switch (state) {
        case NOT_COMMENT:
            if (ch == '/') {
                state = MAYBE_IN;
                fputc(ch, pOut);
            }
            else {
                state = NOT_COMMENT;
                fputc(ch, pOut);
            }
            break;
        case MAYBE_IN:
            if (ch == '/') {
                state = CPP_COMMENT;
                fputc(ch, pOut);
            }
            else if (ch == '*') {
                state = C_COMMENT;
                fputc('/', pOut);
            }
            else {
                state = NOT_COMMENT;
                fputc(ch, pOut);
            }
            break;
        case C_COMMENT:
            if (ch == '*') {
                state = MAYBE_OUT;
            }
            else {
                state = C_COMMENT;
                fputc(ch, pOut);
                if (ch == '\n') {
                    fprintf(pOut, "//");
                }
            }
            break;
        case CPP_COMMENT:
            if (ch == '\n') {
                state = NOT_COMMENT;
                fputc(ch, pOut);
            }
            else {
                state = CPP_COMMENT;
                fputc(ch, pOut);
            }
            break;
        case MAYBE_OUT:
            if (ch == '/') {
                state = NOT_COMMENT;
                nextCh = fgetc(pIn);
                if (nextCh != '\n') {
                    fputc('\n', pOut);
                }
                ungetc(nextCh, pIn);
            }
            else if (ch == '*') {
                state = MAYBE_OUT;
                fputc('*', pOut);
            }
            else {
                state = C_COMMENT;
                fputc('*', pOut);
                fputc(ch, pOut);
            }
            break;
        }

        printf("%c: 当前状态是: %s\n", ch, stateStr[state]);
    }

    fclose(pOut);
    fclose(pIn);

    return 0;
}

转为C++风格注释为:

// 1.一般情况
// int i = 0; 

// 2.换行问题
// int i = 0; 
int j = 0;
// int i = 0; 
int m = 0;

// 3.匹配问题
//int i = 0;/*xxxxx

// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;

// 5.连续注释问题
//
//

// 6.连续的**/问题
//*

// 7.C++注释问题
// /*xxxxxxxxxxxx*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个C语言计算器程序,其中包含进制转换功能的示例代码,带有详细的注释说明。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 将一个十进制整数转换为二进制字符串 char* dec2bin(int dec) { char* result = (char*) malloc(33 * sizeof(char)); // 分配足够的空间,用于存储二进制字符串 int i = 0; do { result[i++] = (dec % 2) + '0'; // 取出二进制位,转为字符 dec /= 2; } while (dec != 0); result[i] = '\0'; strrev(result); // 翻转字符串 return result; } // 将一个二进制字符串转换为十进制整数 int bin2dec(char* bin) { int result = 0; int len = strlen(bin); for (int i = 0; i < len; i++) { result = result * 2 + (bin[i] - '0'); // 将字符转为数字,累加结果 } return result; } // 将一个十进制整数转换为十六进制字符串 char* dec2hex(int dec) { char* result = (char*) malloc(9 * sizeof(char)); // 分配足够的空间,用于存储十六进制字符串 sprintf(result, "%X", dec); // 使用 sprintf 函数将整数转为十六进制字符串 return result; } // 将一个十六进制字符串转换为十进制整数 int hex2dec(char* hex) { int result = 0; int len = strlen(hex); for (int i = 0; i < len; i++) { int digit = 0; if (isdigit(hex[i])) { digit = hex[i] - '0'; // 如果是数字,直接转换为数字 } else { digit = toupper(hex[i]) - 'A' + 10; // 如果是字母,转为相应的数字 } result = result * 16 + digit; // 累加结果 } return result; } int main() { int a, b; char op; printf("请输入一个表达式(例如:10+20):\n"); scanf("%d%c%d", &a, &op, &b); // 读取表达式中的三个部分 switch (op) { case '+': printf("%d + %d = %d\n", a, b, a + b); break; case '-': printf("%d - %d = %d\n", a, b, a - b); break; case '*': printf("%d * %d = %d\n", a, b, a * b); break; case '/': printf("%d / %d = %d\n", a, b, a / b); break; case '%': printf("%d %% %d = %d\n", a, b, a % b); break; case '&': printf("%d & %d = %d\n", a, b, a & b); // 位与运算 break; case '|': printf("%d | %d = %d\n", a, b, a | b); // 位或运算 break; case '^': printf("%d ^ %d = %d\n", a, b, a ^ b); // 位异或运算 break; case '~': printf("~%d = %d\n", a, ~a); // 位取反运算 break; case '<': printf("%d << %d = %d\n", a, b, a << b); // 左移运算 break; case '>': printf("%d >> %d = %d\n", a, b, a >> b); // 右移运算 break; case 'b': printf("%d 的二进制表示为:%s\n", a, dec2bin(a)); // 十进制转二进制 break; case 'd': printf("%s 的十进制表示为:%d\n", (char*) b, bin2dec((char*) b)); // 二进制转十进制 break; case 'x': printf("%d 的十六进制表示为:%s\n", a, dec2hex(a)); // 十进制转十六进制 break; case 'h': printf("%s 的十进制表示为:%d\n", (char*) b, hex2dec((char*) b)); // 十六进制转十进制 break; default: printf("无效的运算符!\n"); } return 0; } ``` 该程序首先读取一个表达式,例如 `10+20`,然后使用 `scanf` 函数分别读取表达式中的三个部分,即两个操作数和一个运算符。然后根据运算符进行相应的计算或转换,最后输出结果。 其中,进制转换部分主要使用了 C 语言的字符串处理函数和数值转换函数。例如,将一个十进制整数转换为二进制字符串,可以使用 `do...while` 循环和 `strrev` 函数实现。将一个二进制字符串转换为十进制整数,可以使用 `for` 循环和字符转数字的方法。将一个十进制整数转换为十六进制字符串,可以使用 `sprintf` 函数实现。将一个十六进制字符串转换为十进制整数,可以使用 `for` 循环和字母转数字的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值