我正在做一件作业,要求我从一个汇编语言中删除空格以及半冒号后的注释。例如mov %a,0x01 ; blah blah blah
。我希望能够在半冒号之前将所有字符存储在数组中并打印它们。任何想法,因为我是一个C菜鸟。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[]) {
char ch;
int i;
//char line[] = "mov %a,0x01 ; system call number (sys_exit)\n";
char label[100];
char *infilename = argv[1];
int length = strlen(line);
FILE *infile = fopen(infilename, "rb");
printf(" ");
while (1) {
ch = fgetc(infile);
if (ch == EOF)
break;
if (isspace(ch) == 0) {
printf("%c", ch);
}
}
fclose(infile);
return 0;
}
答案 0 :(得分:2)
一个简单的状态机:传入文本是评论的一部分吗?
无需保存该行,只需在到达时进行打印。
bool IsComment = false;
int ch; // Insure to use type `int` for proper `EOF` compare and `isspace()` usage.
while ((ch = fgetc(infile)) != EOF) {
if (IsComment) {
if (ch == '\n') {
IsComment = false;
fputc(ch, stdout); // end comment
}
} else if (isspace(ch) && ch != '\n') {
; // do not print space
} else if (ch == ';') {
IsComment = true; // start comment
} else {
fputc(ch, stdout);
}
}
答案 1 :(得分:1)
ch
应定义为int
,因此可以存储值EOF
,并将其与文件结尾前返回的所有unsigned char
值区分开来。
此外,行int length = strlen(line);
引用未定义的变量line
。
这是一个更完整的版本:
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[]) {
int ch, filter = 0, prefix = 1;
char *infilename = argv[1];
FILE *infile = fopen(infilename, "r");
if (infile != NULL) {
while ((ch = fgetc(infile)) != EOF) {
if (prefix) {
prefix = 0;
printf(" "); // print the line prefix
}
if (ch == ';') {
filter = 1; // filter characters until \n
} else
if (ch == '\n') {
filter = 0; // end of line: reset filter
prefix = 1; // and will print the prefix on next line
putchar(ch);
} else
if (!filter && !isspace(ch)) {
putchar(ch); // output character unless filtered
}
}
fclose(infile);
}
return 0;
}
注意:
filter
是一个布尔变量,用于确定是否应输出字符。默认情况下为filter=0
,因此输出字符除非它们是空格。如果读取的字符为;
,则过滤器设置为1
,以便过滤掉;
和以下字符,直到行结束,但不会过滤掉。该方案实现了删除注释。prefix
是一个布尔变量,设置在文件的开头,并在每个换行符之后告诉循环在输出任何字符之前在下一行的开头输出" "
。我推断您希望在代码循环之前从printf(" ");
获取此行为,但它可能出于不同目的。;
总是引入注释,但字符串文字中的;
不会......您可能需要了解更多的汇编语法才能正确实现此过滤器。