如何删除与说明相同的注释?

时间:2018-03-22 07:45:26

标签: c arrays string assembly

我正在尝试从汇编指令文件中删除注释,然后在另一个文件中打印干净的指令。

例如:这个

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);
}

3 个答案:

答案 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;
}

我的方法不是缓冲整行,而是将字符读取和写入交错。

有两个读取循环:一个带输出,一个没有:

  1. 在角色.处,第一个留在第二位。
  2. 在角色\n处,第二个留在第一位。
  3. 检测到输入结束时,一切都结束。 (因此c >= 0的所有检查。)
  4. 输入:

    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 
    

    Life demo on ideone

答案 2 :(得分:0)

具有两种状态的简单状态机(基本上是/不回显字符):

output
相关问题