开头说,我一直潜伏在Stackoverflow中,这是我的第一个问题,但是感谢你们所有善良的灵魂的贡献!我正试图使用C编程从。java文件到。txt文件编写注释和类。我使用fgetc和fputc函数来做到这一点,并设法编写整个文件,但是当我试图沟通时,我只想要到类的注释(所以在"{"之前)。在"}"之后的一切,它似乎不打印任何东西。我对C很陌生,只是有点困。我已经包括我的代码下面,任何帮助将是超级赞赏。对不起,如果这是难以理解的,我的母语不是英语。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *input = fopen("text.java", "r"); //opens file
FILE *comments = fopen("comments.txt", "w");
char ch;
ch = fgetc(input);
while(ch != EOF)
{
while(!strcmp(ch, "{"))
{
fputc(ch, comments);
ch = fgetc(input);
}
ch = fgetc(input);
}
fclose(input);
fclose(comments);
return 0;
}
正如其他人在注释部分已经指出的那样,您的代码有以下错误:
-
fgetc
的返回类型是int
,不是char
。值EOF
不能在char
中表示,因此不应该将int
的返回值截断为char
。相反,您应该将ch
声明为int
。 -
strcmp
函数用于比较字符串,而不是字符。 -
当在你的内部循环中调用
fgetc
时,你没有检查EOF
的返回值。
而且,你解决这个问题的算法似乎也不正确。
解决这个问题的一种方法是让程序始终记住它是否在大括号内,并相应地采取行动。例如,您可以声明一个bool inside_brace
变量,它总是指定您是否在大括号内,像这样:
#include <stdio.h>
#include <stdlib.h>
//the following line is necessary for the "bool" data type
#include <stdbool.h>
int main( int argc, char **argv )
{
FILE *input = fopen("text.java", "r");
FILE *comments = fopen("comments.txt", "w");
int ch;
bool inside_brace = false;
while ( ( ch = fgetc(input) ) != EOF )
{
if ( !inside_brace )
{
if ( ch == '{' )
{
inside_brace = true;
continue;
}
fputc( ch, comments );
}
else //inside a brace
{
if ( ch == '}' )
{
inside_brace = false;
continue;
}
}
}
fclose(input);
fclose(comments);
return EXIT_SUCCESS;
}
注意,这个解决方案将只工作,如果你只有一个嵌套级别的花括号,也就是说,你不让一个{
在另一个{
没有首先关闭第一个{
与}
。如果可能有一个以上的嵌套层,那么变量bool inside_brace
是不够的。相反,您需要一个计数器来跟踪当前的嵌套级别,例如:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char **argv )
{
FILE *input = fopen("text.java", "r");
FILE *comments = fopen("comments.txt", "w");
int ch;
int nesting_level = 0;
while ( ( ch = fgetc(input) ) != EOF )
{
switch ( ch )
{
case '{':
nesting_level++;
continue;
case '}':
nesting_level--;
if ( nesting_level < 0 )
{
fprintf( stderr, "Error: Negative nesting level encountered!n" );
return EXIT_FAILURE;
}
continue;
}
if ( nesting_level == 0 )
fputc( ch, comments );
}
}
fclose(input);
fclose(comments);
return EXIT_SUCCESS;
}