#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
}