gpt4 book ai didi

C程序不会删除占据整行的注释

转载 作者:太空狗 更新时间:2023-10-29 15:57:48 24 4
gpt4 key购买 nike

所以我正在阅读 K&R C 书籍,但我的代码中有一个我根本无法弄清楚的错误。

该程序应该从 C 程序中删除所有注释。显然我只是在使用标准输入

#include <stdio.h>

int getaline (char s[], int lim);

#define MAXLINE 1000 //maximum number of characters to put into string[]

#define OUTOFCOMMENT 0
#define INASINGLECOMMENT 1
#define INMULTICOMMENT 2

int main(void)
{
int i;
int isInComment;
char string[MAXLINE];

getaline(string, MAXLINE);

for (i = 0; string[i] != EOF; ++i) {
//finds whether loop is in a comment or not
if (string[i] == '/') {
if (string[i+1] == '/')
isInComment = INASINGLECOMMENT;
if (string[i+1] == '*')
isInComment = INMULTICOMMENT;
}
//fixes the problem of print messing up after the comment
if (isInComment == INASINGLECOMMENT && string[i] == '\0')
printf("\n");

//if the line is done, restates all the variables
if (string[i] == '\0') {
getaline(string, MAXLINE);
i = 0;
if (isInComment != INMULTICOMMENT)
isInComment = OUTOFCOMMENT;
}

//prints current character in loop
if(isInComment == OUTOFCOMMENT && string[i] != EOF)
printf("%c", string[i]);

//checks to see of multiline comment is over
if(string[i] == '*' && string[i+1] == '/' ) {
++i;
isInComment = OUTOFCOMMENT;
}

}
return 0;

}

所以除了一个问题外,这很好用。每当一行以评论开头时,它就会打印该评论。

例如,如果我有一行很简单

//this is a comment

在评论开始之前没有任何内容,它会打印该评论,即使它不应该打印。

我以为我取得了不错的进步,但这个错误确实阻碍了我。我希望这不是我错过的 super 简单的事情。

编辑:忘记 getaline 函数

//puts line into s[], returns length of that line
int getaline(char s[], int lim)
{
int c, i;

for (i = 0; i < lim-1 && (c = getchar()) != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

最佳答案

你的代码有很多问题:

  • isInComment未在函数中初始化 main .
  • 正如其他人所指出的,string[i] != EOF是错的。您需要更精确地测试文件结尾,尤其是对于不以换行结尾的文件。此测试仅在 char 时有效类型已签名并且 EOF是有效的 signed char值(value)。尽管如此,它还是会错误地停在迷路上\377字符,在字符串或注释中是合法的。
  • 当您检测到行尾时,您读取另一行并重置 i0 ,但是在您再次测试单行注释之前 将通过 for 循环增加 i... 因此出现错误!
  • 您不处理特殊情况,例如 /* // */// /*
  • 您不处理字符串。这不是评论:"/*" ,也不是这个:'//'
  • 您不处理 \在行尾(转义换行符)。这可用于扩展单行注释、字符串等。还有更多与 \ 相关的微妙情况。处理,如果你真的想要完整性,你也应该处理三字母。
  • 您的实现对行大小有限制,这不是必需的。

分配给您的问题有点棘手。不是读取和解析行,而是一次读取一个字符并实现一个状态机来解析转义的换行符、字符串和两种注释样式。如果您使用此方法正确执行代码,则代码不会太难。

关于C程序不会删除占据整行的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28657134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com