【发布时间】:2015-02-22 11:10:57
【问题描述】:
所以我正在阅读 K&R C 这本书,但我的代码中有一个我根本无法弄清楚的错误。
该程序应该从 C 程序中删除所有 cmets。显然我只是在使用标准输入
#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
在评论开始之前没有任何内容,它会打印该评论,即使它不应该这样做。
我以为我取得了很好的进展,但这个错误真的让我很受挫。我希望这不是我错过的一些超级简单的事情。
编辑:忘记 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;
}
【问题讨论】:
-
“getaline”功能有什么?
-
string[i] != EOF似乎不对。我觉得应该是string[i] != '\0' -
string[i] != EOF;-->string[i] != 0;开始。
标签: c