- 去除代码中注释需要注意下面几点
首先注释有”/*”开始到”*/”结束的多行或单行注释
其次还有”//”这种单行注释
另外还需要注意双引号和单引号内的字符不要算到注释中 - 因此我设计以下程序
当遇到””“双引号和”’“时需要跳过整个字符串,特别注意字符串和字符内部转义字符。
当遇到”/“斜杠时,匹配下一个为星号还是斜杠,如果下一个是斜杠则直接跳到本行结尾。如果是星号则匹配”*/” - 下面是源代码,没啥特别的
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
/**
* 去掉字符串中注释部分
**/
void remove_comment(char *buf)
{
size_t off;
char *s, *p, *t, *tmp;
char *sss="adas\"d/**/\"*a\"//s/**/d*/"; // 这里主要测试字符串内带注释字符
for (s = p = buf; *p != '\0'; p++) {
switch(*p) {
case '"': // 直接循环到下一个 "
case '\'': /* 直接循环到下一个 ' */
// 下面找到字符串结束位置,避免匹配字符串内部的 /* 或者 //
for (tmp = p + 1; *tmp != *p; tmp++) {
if (*tmp == '\\') {
tmp++; /* 跳过转义位置,因为转义字符2个位置代表一个字符 */
}
}//阿萨德撒
// while(1) {
// if ( NULL != (t = strchr(tmp, '\\')) ) {
// printf("%c\n", *tmp);
// tmp = t + 2; // 有转义字符
// }
// if ( NULL != (t = strchr(tmp, *p)) ) {
// tmp = t + 1; // 有要找的字符
// break;
// }
// }
// printf("%c