标题:删除c源文件注释的问题
只看楼主
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
已结贴  问题点数:20 回复次数:6 
删除c源文件注释的问题
void echo_quote(int c)        //原样打印''""里面值的函数,读到'或者"进入该函数
{
    int d;
    putchar(c);
    while ((d = getchar()) != c)
    {
        putchar(d);
        //if (d == '\\')
        //putchar(getchar());    有if语句和没有if语句有什么区别;
            
    }
    putchar(d);

用例:'123\\t'
在我看来当读到\的时候,输出就会读到下一个\,输出结果:'123\t'
而实际结果没有改变:'123\\t'
脑子炸了,请解惑!
搜索更多相关主题的帖子: 源文件 
2017-04-30 16:00
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:10 
嗯,这个题正好我贴了代码在论坛。(链接中的程序是不完善的,因为无法处理超过10W个字节的源文件。)
https://bbs.bccn.net/thread-474085-1-1.html

如果d == '\\',那么就再读取一个字符,并且输出。
这是在判断转义字符。

\' 在C语言中,等于 单引号。
循环是以' 或者 “作为结束判断,因此,如果读取到这样的转义字符,循环就会结束。

假设读取到'\''这样一个字符,而没有那么判断,会出现什么情况?第一个单引号进入函数,第二个单引号结束循环,第三个单引号进入函数,问题就出现了,在这里函数会一直读取,直到遇到另一个单引号,因此如果单号在注释中会出现什么情况?或者更普遍的是另一个字符。

[此贴子已经被作者于2017-4-30 18:41编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-30 18:16
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
是否把:
char buf[]={'1','2','3',0x5C,0x5C,'t'}; \\这个合法
理解成:
char buf[]={'1','2','3','\','\','t'};   \\这个不合法
2017-04-30 20:00
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 楼主 Emotiona
帮忙看看有判断和没判断语句有啥区别了。还是没明白。。。

程序代码:
#include<stdio.h>

void rcomment(int c);
void in_comment();
void echo_quote(int c);

int main()
{
    int c;
    while ((c = getchar()) != EOF)
        rcomment(c);
    return 0;
}

void rcomment(int c)
{
    int d;
    if (c == '/')
        if ((d = getchar()) == '*')
            in_comment();
        else if (d == '/')
        {
            while ((d = getchar()) != EOF && d != '\n');
        }
        else
        {
            putchar(c);
            putchar(d);
        }
    else if (c == '\'' || c == '"')
        echo_quote(c);
    else
        putchar(c);
}

void in_comment()
{
    int c, d;
    c = getchar();
    d = getchar();
    while (c != '*' || d != '/')
    {
        c = d;
        d = getchar();
    }
}

void echo_quote(int c)
{
    int d;
    putchar(c);
    while ((d = getchar()) != c)
    {
        putchar(d);
        //if (d == '\\')
        //putchar(getchar());
            
    }
    putchar(d);
}
2017-05-01 15:53
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 3楼 吹水佬
不懂你的意思。我就想知道有判断语句和没有有什么区别。我不知道用什么测试用例去证明。麻烦有实例说明下,谢谢吹佬!
2017-05-01 15:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用Emotiona在2017-5-1 15:54:41的发言:

不懂你的意思。我就想知道有判断语句和没有有什么区别。我不知道用什么测试用例去证明。麻烦有实例说明下,谢谢吹佬!

有判断语句 if (d == '\\'),循环体内就getchar()多一次。
可能是规范了“\”字符后面不能是“"”或“'”字符,否则可能会有意想不到的结果。
如:输入'123\',就有可能不能正常跳出 while ((d = getchar()) != c) 循环。

2017-05-01 17:30
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
原来的函数就是原样打印,现在考虑到吹佬说的当遇到\'或者\"应该是'或者"     改了下函数,如下:
void echo_quote(int c)
{
    int d;
    putchar(c);
    while ((d = getchar()) != c)
    {
        
        if (d != '\\')
        putchar(d);
        else
        {
            if ((c = getchar()) == '\'' || c == '"')
                putchar(c);
            else
            {
                putchar(d);
                putchar(c);
            }
        }
            
    }
    putchar(d);
}
2017-05-01 20:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-476548-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.323684 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved