K

#c #comments

#c #Комментарии

Вопрос:

«Упражнение 1-23. Напишите программу для удаления всех комментариев из программы на C. Не забывайте правильно обрабатывать строки в кавычках и символьные константы. Комментарии C не вложены «. K amp; R стр. 34

В принципе, у меня есть два вопроса:

1) Я совершенно новичок в программировании, и я хотел знать, правильно ли я хотя бы думаю о проблеме.

2) Код был создан для игнорирования // till n или /* till */ . Но с /* комментарием он всегда оставляет один / .


Ввод: abc/*comment*/123

Вывод: abc/123


Ввод: abc/*123

Вывод: abc/


 #include <stdio.h>
char s[1000]; //Principal array
int countS; //Number of char in array

int deletSingleLineComments(void);
int deletMultiLineComments(void);

int main(void){
    int c;
    while((c=getchar())!=EOF){
        s[countS]=c;
          countS;
    }

    deletMultiLineComments(); //Function 1
    deletSingleLineComments(); //Function 2

    printf("ns[]=n%snncountS[]=%dn",s,countS);
}



//Functions 1
int deletMultiLineComments(void){
    char t[1000];
    int i=0;
    int inComment=0;
    int diff=0;
    int a,b,c;

    while(i<=countS){ 
        t[i]=s[i];
          i;
    }
    i=0;

    while(i<=countS){

        if(t[i]=='/' amp;amp; t[i 1]=='*'){ 
            inComment=1;
        }

        if(inComment==1){
              diff; //to equilibrate the number
        }

        if(inComment==0){
            s[i-diff]=t[i];
        }

        if(t[i]=='*' amp;amp; t[i 1]=='/'){
            inComment=0;
        }
          i;
    }
    s[i-diff 1]='';
    countS=i-diff;

    printf("nt[]=n%sn",t);
}



//Function 2
int deletSingleLineComments(void){
    int i=0;
    char t[1000];
    int inComment=0;
    int diff=0;

    while(i<=countS){
        t[i]=s[i];
          i;
    }
    i=0;

    while(i<=countS){

        if(t[i] == '/' amp;amp; t[i 1] == '/'){
            inComment=1;
        }

        if(t[i]=='n'){
            inComment=0;
        }

        if(inComment==1){
              diff;
        }

        if(inComment==0){
            s[i-diff]=t[i];
        }
        s[i-diff 1]='';
          i;
    }
    countS=i-diff;
}
  

Спасибо.

Комментарии:

1. Вы использовали отладчик для отслеживания выполнения вашей программы? Или даже базовые отладки printf? Обучение и приобретение опыта эффективной отладки стоят затраченных усилий.

2. Нужно ли мне устанавливать отладчик или он у меня уже есть? Я пишу в iOS El capitan с помощью TextWrangler.

Ответ №1:

 while(i<=countS){ t[i]=s[i];... }
  

Обратите внимание, что символьные строки основаны на нуле. Например "ABC" , имеет длину 3 , начинается с нулевого индекса, а последний допустимый индекс равен 2 (not 3 ). Поэтому вам следует изменить условие на i < string_length

 while(i < countS){ t[i]=s[i];... }
  

Также будьте осторожны при доступе t[i 1] , потому что, хотя i он действителен, i 1 он может быть вне пределов.

 if (i < (countS - 1))
    if(t[i]=='/' amp;amp; t[i 1]=='*')
  

Чтобы присвоить одну строку другой, вы можете ввести вторую переменную k и увеличивать k ее после каждого присвоения. Этот метод проще (на мой взгляд), чем использование diff переменной и выполнение сложений и вычитаний.

Кроме того, вместо того char t[1000]; , чтобы вы можете использовать char *t = malloc(countS); для объявления временной переменной длины countS , тогда она должна быть освобождена в конце с free(t) помощью . Если ваш компилятор поддерживает массив переменной длины, вы можете просто поместить char t[countS] .

Пример:

 char s[1000]; //Principal array
int countS; //Number of char in array

//Functions 1
void deletMultiLineComments(void) 
{
    char *t = malloc(countS);
    int i = 0;
    int k = 0;
    int inComment = 0;

    while (i < countS)
    {
        t[i] = s[i];
          i;
    }

    i = 0;
    while (i < countS) 
    {
        if (i < countS - 1)
        if (t[i] == '/' amp;amp; t[i   1] == '*') 
        {
            inComment = 1;
            i =2;
            continue;
        }

        if (inComment == 1) 
        {
            if (i < countS - 1)
            if (t[i] == '*' amp;amp; t[i   1] == '/')
            {
                inComment = 0;
                i =2;
                continue;
            }
        }

        if (inComment == 0) 
        {
            s[k] = t[i];
            k  ;
        }

          i;
    }

    free(t);
    s[k] = '';
    countS = k;

    printf("mulitline comment removed %sn", s);
}

//Function 2
void deletSingleLineComments(void) 
{
    char *t = malloc(countS);
    int i = 0;
    int k = 0;
    int inComment = 0;

    while (i < countS) 
    {
        t[i] = s[i];
          i;
    }

    i = 0;
    while (i < countS) 
    {
        if (i < countS - 1)
            if (t[i] == '/' amp;amp; t[i   1] == '/')
            {
                inComment = 1;
                i  = 2;
                continue;
            }

        if (t[i] == 'n')
        {
            inComment = 0;
        }

        if (inComment == 0) 
        {
            s[k] = t[i];
            k  ;
        }

        i  ;
    }
    free(t);    
    s[k] = '';
    countS = k;

    printf("single comment removed %sn", s);
}

int main(void) 
{
    //get input
    scanf("%s", s);

    countS = 0;
    while (s[countS]) countS  ;

    deletMultiLineComments(); //Function 1
    deletSingleLineComments(); //Function 2
}