2016-03-09 4 views
0

До сих пор мне была предоставлена ​​часть программы сборки для задания, которое начиналось с таких строк, как: main: mov %a,0x04 ; sys_write. В некоторых строках есть метка (это слово с точкой с запятой на конце), а некоторые - нет. Все после ; является комментарием и его нужно удалить. Пробелы нужно удалить и вернуть обратно, чтобы готовый продукт выглядел примерно так: main: mov %a,0x04. Я потратил много дней на это и подумал, что вы, ребята, знали, как помещать пробелы, потому что в настоящее время это выглядит так: main:mov%a,0x04. Любой надежный способ повсеместного добавления белых пространств был бы оценен.Добавление пробелов обратно в мою программу сборки

int i; 
char line[256]; 
while(fgets(line,256,infile) != NULL) 
{ 
    char label[256]; 
    int n = 0; 
    for(i=0; i<256; i++) 
    { 
     if(line[i] == ';') // checks for comments and removes them 
      { 
      label[n]='\0'; 
      break; 
      } 
     else if(line[i] != ' ' && line[i] != '\n') 
      { 
      label[n] = line[i]; // label[n] contains everything except whitespaces and coms 
      n++; 

      } 
    } 

    char instruction[256]; 
    for(n =0; n<strlen(label);n++) 
    { 
     //don't know how to look for commands like mov here 
     // would like to make an array that puts the spaces back in? 
    } 

    // checks if string has characters on it. 
    int len = strlen(label); 
    if(len ==0) 
     continue; 
    printf("%s\n",label); 
} 
fclose(infile); 
return 0; 
+1

':' является двоеточие, ';' является ** ** полу двоеточие. – Olaf

+0

Да, так что все после полуплотности не должно быть напечатано. Слово перед двоеточием называется ярлыком, например main: или name: etc ... – Jason

+0

Возможно, вы должны удалить только лишние пробелы (то есть один за другим), а не пытаться вернуть их обратно ... – Jester

ответ

1

Я разделяю строку на подстроки между пробелами, а затем добавляю пространство между ними.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
FILE *infile=fopen("assembly","r"); 
char line[256]; 
while(fgets(line,256,infile) != NULL) 
{ 
    char* tok=strtok(line,";");      //search for comma 
    char* label=malloc(strlen(tok)*sizeof(char)); //allocate memory for 
                //string until comma 

    strcpy(label,"");        //clean string 
    tok=strtok(tok," ");       //search for space 
    while(tok != NULL){ 
     if(strlen(label)>0)       //when not empty, 
      strcat(label," ");      //add space 
     strcat(label,tok); 
     tok=strtok(NULL," "); 
    } 
    printf("%s_\n",label); 
    free(label); 
} 
fclose(infile); 
return 0; 

Если вы все еще хотите сделать это на своем пути, я бы сделал это, как этот

(...) 
    else if((line[i] != ' ' && line[i] != '\n')||(line[i-1] != ' ' && line[i] == ' ')) 
     {     // also copy first space only 
     label[n] = line[i]; // label[n] contains everything except whitespaces and coms 
     n++; 
     } 
    } 
    printf("%s\n",label); 
} 
fclose(infile); 
return 0; 
} 
+0

'malloc (strlen (tok) * sizeof (char)) 'должен быть' malloc (strlen (tok) + 1) '. Очевидно, что этот код будет работать только в том случае, если все элементы будут правильно разделены на части для начала, поэтому он не будет работать, если, например, есть пробел между меткой и двоеточием или пространство с обеих сторон запятой. Кроме того, 'if (label [0]! = '\ 0')' намного эффективнее вызова 'strlen()' каждый раз через цикл. –

+0

привет спасибо за ваш вклад, но как насчет того, если я не хочу копировать первое пространство. Потому что после двоеточия мне нужно 4 пробела до mov, и если его mov% b, 0x01, например, сам по себе должен иметь отступ 2 табуляции. самая сложная часть этого будет заключаться в получении формата записи. – Jason

+0

Вы можете найти двоеточие и добавить 4 пробела или \ t \ t для отступа 2 табуляции. –

Смежные вопросы