这个程序应该从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 =='/')。
有人知道为什么吗?感谢。
答案 0 :(得分:2)
C没有注意到缩进代码的方式。它只关心自己的语法。
仔细查看您的else
并考虑他们附加的if
(提示:最近的一个)。
还有其他错误。 EOF
不为0,因此只有第一个while
是正确的。如果评论如下所示会发生什么:/* something **/
?
答案 1 :(得分:1)
while (c = getchar()) //While there is a character and is not EOF
你假设EOF == 0
。为什么不明确并将前一行更改为:
while((c = getchar()) != EOF)
else putchar('/'); putchar(c);
两个putchar
都应该是else
子句的一部分吗?如果是这样,您需要围绕两个{}
语句使用大括号putchar
。另外,给每个putchar
自己的行;它不仅看起来更好,而且更具可读性。
除了我刚才提到的,你的逻辑看起来很合理。
答案 2 :(得分:0)
如前所述,if / else匹配不正确。一个缺少功能的缺点是你必须使它更有状态,以便跟踪你是否在字符串内,例如。
printf("This is not // a comment\n");