C注释风格/* hhhfjjjsjd */
C++注释风格//huajaijdh
//hushushdxkk
c转c++可能遇到的问题:
1.一般情况
/* 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++注释问题
// /*xxxxxxxxxxxx*/
转换关系图:
#include <stdio.h>
#include <assert.h>
/*
fopen/fclose
getchar - 文件内读 -> fgetc
putchar - 文件内写 -> fputc
printf - 文件内打印 -> fprintf
*/
#if 0
/* ... *
1. /* ... */
2. /* ... * 9527
3. /* ... **/
#endif
#include <stdio.h>
// 状态
typedef enum {
CODE, // 代码状态
YU_DAO_XIE_GANG, // 遇到 /
C_COMMENT, // C 风格注释
CPP_COMMENT, // C++ 风格注释
YU_DAO_XING // C 风格中遇到 *
} State;
// GBK 一个汉字占两个字符(char, char)
void Convert(FILE *pIn, FILE *pOut)
{
// 当前状态, CODE 是初始状态
State state = CODE;
const char * state_desc[] = {
"正常状态",
"遇到 / ",
"C 风格注释",
"C++ 风格注释",
"C 风格中遇到 * "
};
int ch;
int nextCh;
while (1) {
// 从输入文件依次读出一个字符
ch = fgetc(pIn);
// 处理读完文件的情况
if (ch == EOF) {
break;
}
printf("读到字符: %c,当前状态: %s --> ", (char)ch, state_desc[state]);
// 根据当前状态 + 读到的字符,决定下个状态
switch (state) {
case CODE:
if (ch == '/') {
state = YU_DAO_XIE_GANG;
}
fputc(ch, pOut);
break;
case YU_DAO_XIE_GANG:
if (ch == '*') {
state = C_COMMENT;
fputc('/', pOut);
}
else if (ch == '/') {
state = CPP_COMMENT;
fputc(ch, pOut);
}
else {
state = CODE;
fputc(ch, pOut);
}
break;
case C_COMMENT:
if (ch == '*') {
state = YU_DAO_XING;
}
else {
fputc(ch, pOut);
if (ch == '\n') {
fprintf(pOut, "//");
}
}
break;
case CPP_COMMENT:
if (ch == '\n') {
state = CODE;
}
fputc(ch, pOut);
break;
case YU_DAO_XING:
if (ch == '/') {
state = CODE;
nextCh = fgetc(pIn);
if (nextCh != '\n') {
fputc('\n', pOut);
}
ungetc(nextCh, pIn);
}
else if (ch != '*') {
state = C_COMMENT;
fputc('*', pOut);
fputc(ch, pOut);
}
else {
// 上一个 *,而不是 ch 这个 *
fputc('*', pOut);
}
break;
}
printf("%s\n", state_desc[state]);
}
}
int main()
{
// 相对路径,绝对路径
// 相对路径
FILE *pIn = fopen("input.c", "r");
if (pIn == NULL) {
perror("fopen input");
return 1;
}
// a -> append
FILE *pOut = fopen("output.c", "w");
if (pOut == NULL) {
perror("fopen output");
fclose(pIn);
return 1;
}
Convert(pIn, pOut);
fclose(pOut);
fclose(pIn);
return 0;
}