为什么这个程序产生错误的输出

时间:2013-12-15 22:46:30

标签: c

这个程序应该从C源代码中删除所有注释(在这种情况下,注释被认为是双斜线'//'和换行符'\ n'以及它们之间的任何内容,以及'/ *之间的任何内容'和'* /'。

该计划:

#include <stdio.h>

/* This is a multi line comment
testing */

int main() {
int c;

while ((c = getchar()) != EOF)
{
    if (c == '/') //Possible comment
    {
        c = getchar();
        if (c == '/') // Single line comment
            while (c = getchar()) //While there is a character and is not EOF
                if (c == '\n') //If a space character is found, end of comment reached, end loop
                    break; 


        else if (c == '*') //Multi line comment 
        {
            while (c = getchar()) //While there is a character and it is not EOF
            {   
                if (c == '*' && getchar() == '/') //If c equals '*' and the next character equals '/', end of comment reached, end loop
                    break;
            }                   
        }

        else putchar('/'); putchar(c); //If not comment, print '/' and the character next to it
    }

    else putchar(c); //if not comment, print character
}

}

使用此源代码作为自己的输入后,这是我得到的输出:

#include <stdio.h>

* This is a multi line comment
testing *

int main() {
int c;

while ((c = getchar()) != EOF)
{
    if (c == '') ////////////////
    {
        c = getchar();
        if (c == '') ////////////////////
            while (c = getchar()) /////////////////////////////////////////
                if (c == '\n') ///////////////////////////////////////////////////////////////
                    break; 


        else if (c == '*') ///////////////////
        {
            while (c = getchar()) ////////////////////////////////////////////
            {   

超越这一点。我正在使用ubuntu终端上的g ++编译它。

正如您所看到的,多行注释只删除了他们的'/'字符,而单行符号则将所有字符替换为'/'。除此之外,任何不是新评论开头的'/'字符也被删除,如if(c =='')行,它应该是if(c =='/')。

有人知道为什么吗?感谢。

3 个答案:

答案 0 :(得分:2)

C没有注意到缩进代码的方式。它只关心自己的语法。

仔细查看您的else并考虑他们附加的if(提示:最近的一个)。

还有其他错误。 EOF不为0,因此只有第一个while是正确的。如果评论如下所示会发生什么:/* something **/

答案 1 :(得分:1)

您有一些(明显的)逻辑错误......

1

while (c = getchar()) //While there is a character and is not EOF

你假设EOF == 0。为什么不明确并将前一行更改为:

while((c = getchar()) != EOF)

2

else putchar('/'); putchar(c);

两个putchar都应该是else子句的一部分吗?如果是这样,您需要围绕两个{}语句使用大括号putchar。另外,给每个putchar自己的行;它不仅看起来更好,而且更具可读性。

结论

除了我刚才提到的,你的逻辑看起来很合理。

答案 2 :(得分:0)

如前所述,if / else匹配不正确。一个缺少功能的缺点是你必须使它更有状态,以便跟踪你是否在字符串内,例如。

printf("This is not // a comment\n");