我正在尝试从汇编指令文件中删除注释,然后在另一个文件中打印干净的指令。
例如:这个
TESTD TD STDIN
JEQ TESTD . Loop until ready
RD STDIN . Get input to see how many times to loop
STA NUMLOOP . Save the user's input into NUMLOOP
STLOOP STX LOOPCNT . Save how many times we've loops so far
成为这个:
TESTD TD STDIN
JEQ TESTD
RD STDIN
STA NUMLOOP
STLOOP STX LOOPCNT
=============================================== ===========================
我写了这个程序来删除标记注释的点后面的任何东西,包括点,但它没有用;输出文件包含与输入文件相同的注释行。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
FILE *fp, *fp2; // input and output file pointers
char ch[1000];
fp = fopen(argv[1], "r");
fp2 = fopen(argv[2],"w");
while( fgets(ch, sizeof(ch), fp)) // read line into ch array
{
int i = 0 ;
for( ch[i] ; ch[i]<=ch[1000] ; ch[i++]) // loop to check all characters in the line array
{
if(ch[i] == '.')
{
for( ch[i] ; ch[i] <= ch[1000] ; ch[i++])
{
ch[i] = '\0'; //making all characters after the point NULL
}
}
continue;
}
fputs(ch, fp2);
}
fclose(fp);
fclose(fp2);
return(0);
}
答案 0 :(得分:4)
你的循环毫无意义:
for( ch[i] ; ch[i] <= ch[1000] ; ch[i++])
因为ch[i] <= ch[1000]
比较了字符的值。另外ch[1000]
无效,因为数组的大小为1000
,因此最高有效索引为999
。
由于您的循环会在ch[i] <= ch[1000]
false
后立即结束,并且因为我们不知道ch[1000]
的价值可能是什么,所以很有可能你的循环永远不会被执行,因此根本没有修改任何行。 (如果ch[1000]
计算的值总是大于数组中的任何字符,那么循环也有可能永远循环。)
正确循环:for(i = 0; i < 1000; i++)
更好的方法是检查循环中的实际行长度。
此外,您不需要在0
之后将所有字符设置为dot
。做什么的?只需将ch[i]
设置为0
,即可完成:
if(ch[i] == '.')
{
ch[i] = '\0';
}
在旁注中,循环结束时的continue;
是多余的。将if
设置为dot
后,您可能希望将其放在0
- 语句中。
答案 1 :(得分:2)
我认为OP的代码设计有点不吉利。由于内部缓冲区char ch[1000];
,存在一个可以轻易阻止的约束:
#include <stdio.h>
int main(void)
{
FILE *fIn = stdin, *fOut = stdout;
/* loop until end of input */
for (int c = getc(fIn); c >= 0;) {
/* read and write until '.' is detected */
for (; c >= 0 && c != '.'; c = getc(fIn)) {
if (putc(c, fOut) < 0) {
fprintf(stderr, "Write failed!\n"); return -1;
}
}
/* read only until '\n' is detected */
for (; c >= 0 && c != '\n'; c = getc(fIn)) ;
}
/* done */
return 0;
}
我的方法不是缓冲整行,而是将字符读取和写入交错。
有两个读取循环:一个带输出,一个没有:
.
处,第一个留在第二位。\n
处,第二个留在第一位。c >= 0
的所有检查。)输入:
TESTD TD STDIN
JEQ TESTD . Loop until ready
RD STDIN . Get input to see how many times to loop
STA NUMLOOP . Save the user's input into NUMLOOP
STLOOP STX LOOPCNT . Save how many times we've loops so far
输出:
TESTD TD STDIN
JEQ TESTD
RD STDIN
STA NUMLOOP
STLOOP STX LOOPCNT
答案 2 :(得分:0)
具有两种状态的简单状态机(基本上是/不回显字符):
output