c - 从 C 样式字符串问题中删除 C 样式注释的函数

标签 c string

<分区>

我正在尝试创建一个从字符串中删除 C 风格注释的函数。

我在使用指针遍历 char 数组时尝试使用经典的 while 循环,现在使用两个指针(p2p1 领先一步,并且他们都从头开始)。我尝试检查 *p1 == '/' 和当 *p2 == '*' 时,当它是真的时,我会创建两个新的指针来找到注释的结尾(*p3 == '*' && *p4 == '/'),然后我会创建两个新指针 p5p6 ,其中第一个指向 p1(注释中的第一个字符,应该是 '/',第二个指向 p4(将被删除的最后一个字符),我会使用 while 循环来尝试

执行 while(*p5++ = *p6++);

遗憾的是,这不起作用。

#include <stdio.h>

void remove_comments(char* s) {

    char *p1=s;
    char *p2 = s;   
        p2++; // move p2 ahead of p1;


    while(*p1 !='\0' && *p2 !='\0') { 

        if(*p1=='/' && *p2=='*') { // beginning of comment
            char *p3 = p1; // save their positions and
            char *p4 = p2; //create two new pointers

            while(*p3 !='\0' && *p4 !='\0') {
            if(*p3 == '*' && *p4 == '/') { //if end of comment

                    char *p5 = p1;
                    char *p6 = p4;

                    while(*p5++ = *p6++);

                } else p1++;

                p3++;
                p4++;

            }




        }
        p1++;
        p2++;


    }




    }




int main() {


    char arr[] = "This is an /*this is a comment*/ example!";

    remove_comments(arr);

    printf("%s", arr);



    return 0;
}

上面的代码应该产生输出 This is an example!,但字符串保持不变。我该如何解决这个问题?

最佳答案

打开编译器警告 (gcc -Wall)。

这个(来自以前的修订版):

test.c: In function ‘remove_comments’:
test.c:11:29: warning: comparison between pointer and integer
         if(*p1 == '/' && p2 == '*')
                             ^~

使问题的一部分变得非常明显(它无法检测到序列)。

改变这个:

        if(*p1=='/' && p2=='*') { // beginning of comment

为此:

        if(*p1=='/' && *p2=='*') { // beginning of comment

您在不需要时递增 s1,这会导致错误。

删除这个:

                else
                    p1++;

除此之外,这里的代码:

                if(*p3 == '*' && *p4 == '/')
                { // if end of comment

                    char *p5 = p1;
                    char *p6 = p4;

正在从 p4 复制斜杠。

将该 block 更改为:

                if(*p3 == '*' && *p4 == '/')
                { // if end of comment

                    char *p5 = p1;
                    char *p6 = p4+1;

并且,结合其他更改,您的代码可以正常工作。

我建议将 while(*p5++ = *p6++); 更改为 strcpy(p5, p6);; strcpy 可能会更快。

它不会产生您想要的确切输出,但会删除 /**/ 之间的所有字符,包括在内。

关于c - 从 C 样式字符串问题中删除 C 样式注释的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57662862/

相关文章:

c - c程序删除字符串中重复的单词

C 字符串文字链接

Java String.replace() - 替换的不仅仅是我指定的子字符串?

c - 在 3 位数字上使用逻辑或关系运算符进行素数测试

c - 如何允许使用 scanf 输入空格?

c++ - 解析 URL 字符串以删除不需要的内容 (C++)

python - 显示工作日的预订

c - 在 C 中打印字符指针数组时出现奇怪的输出

c - C代码中switch-case中的 "..."是什么

c - C 中的 Posix 正则表达式错误