注释一般来讲有分为两种:
一是单行注释:直接在该行需要注释的地方加上”//”就行
如:// int a=0;
int b=0; //定义一个变量
另外还有一种是多行同时注释(不能嵌套使用):
如:/*
int a,b;
int c,d;
*/
其中/* 和 */起限定范围的作用,该范围内的语句都会被注释掉,将不再起作用。
当然以上多行注释也是可以用来单行注释的
//int a,b;
//int c,d;
一般来讲我们习惯把‘//’这种注释叫作c++注释,
‘/* */’叫作c语言注释
接下来我们来试着用代码实现一下从c注释到c++注释的转换
图解:
代码实现
commentconvert.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include <stdio.h>
#include <stdlib.h>
enum STATE
{
NUL_STATE,//无状态
C_STATE, //c状态
CPP_STATE,//c++状态
END_STATE //结束状态
};
void DoNulState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoComment(FILE *pfIn, FILE *pfOut);
#endif //__COMMENT_CONVERT_H__
commentconvert.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"commentconvert.h"
void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE* s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case'/':
{
int second;
second = fgetc(pfIn);
switch (second)
{
case'*':
fputc('/', pfOut);
fputc('/', pfOut);
*s = C_STATE;
break;
case'/':
fputc(first, pfOut);
fputc(second, pfOut);
*s = CPP_STATE;
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
break;
}
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case'\n':
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
case'*':
{
int second = fgetc(pfIn);
switch (second)
{
case'/':
{
*s = NUL_STATE;
int third = fgetc(pfIn);
switch (third)
{
case'\n':
fputc(third, pfOut);
break;
case'/':
ungetc(third, pfIn);
fputc('\n', pfOut);
break;
default:
fputc('\n', pfOut);
fputc(third, pfOut);
}
}
break;
case'*':
fputc(second, pfOut);
ungetc(second,pfIn);
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
break;
}
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case'\n':
fputc(first, pfOut);
*s = NUL_STATE;
break;
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoComment(FILE*pfIn, FILE*pfOut, enum STATE* s)
{
enum STATE state = NUL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulState(pfIn, pfOut, &state);
break;
case C_STATE:
DoCState(pfIn, pfOut, &state);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut, &state);
break;
default:
break;
}
}
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"commentconvert.h"
void test()
{
FILE *pfIn = NULL;
FILE *pfOut = NULL;
pfIn = fopen("test.c1.txt", "r");
if (pfIn == NULL)
{
perror("open file for read.");
exit(EXIT_FAILURE);
}
pfOut = fopen("test.c2.txt", "w");
if (pfOut == NULL)
{
perror("open file for write.");
fclose(pfIn);
exit(EXIT_FAILURE);
}
DoComment(pfIn, pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
system("pause");
return 0;
}
转换效果图