Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2012, 18:43   #1
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
Подмигивание Удаление комментариев

Всем добрый день, кто читает эту тему. Вот решил сделать программу, которая удаляет из кода Си комментарии. Пока что рассматриваю 1 случай(закрытого комментария): /*...*/. Но к сожалению, написанный мною код не работает, хотя, на мой взгляд, логически и синтаксически все верно...(много раз уже проверял) Выглядит он так:
Код:
char turn(char arrow[], int size)
{ 
	for(int i = 0;i<size;i++)
	{
	
		if(arrow[i] == '/' && arrow[i+1] == '*') //проверка 1 на наличие комментария(/* - значит начало)
			{while(arrow[i] != '*' && arrow[i+1] != '/') //удаление комментария по принципу: пока не будет "*/"
				arrow[i] = '_'; //пока заменяем на "_" для видного результата
			}	
	}
	printf("%s",arrow);
return 0;
}
В функцию поступает массив с символами, идет проверка... ну в прочем в комментах я написал что к чему) Надеюсь на вашу подсказку и помощь
Павел_95 вне форума Ответить с цитированием
Старый 04.11.2012, 21:15   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

в цикле while не изменяется i
pu4koff вне форума Ответить с цитированием
Старый 05.11.2012, 00:27   #3
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

я не сильно понял... почему не изменяется? неужели для этого простого действия нужна ссылка...или указатель(я не сильно пока в этом разбираюсь ) Если можете, пожалуйста, наведите пример, как это должно быть в правильном варианте... А, я наверное понял... Вы имели ввиду то, что он не просматривает массив символов дальше, а зацикливается именно на этом i? Как я уже не пытался его обмануть:
сначала попробовал заменить сразу же эти 2 символа i на _, что бы они уже точно не попали под while (!=) и цикл продолж. - нихрена:
Код:
                      arrow[i]='_';  arrow[i+1]='_';
				while(arrow[i] != '*' && arrow[i+1] != '/') //удаление комментария по принципу: пока не будет "*/"
				arrow[i] = '_'; //пока заменяем на "_" для видного результата
потом попробовал начать смотреть уже со следующих символов - нихрена:
Код:
				while(arrow[i+2] != '*' && arrow[i+3] != '/') //удаление комментария по принципу: пока не будет "*/"
				arrow[i] = '_'; //пока заменяем на "_" для видного результата
Уже не знаю что делать.Объясните, если не лень)

Последний раз редактировалось Павел_95; 05.11.2012 в 01:49.
Павел_95 вне форума Ответить с цитированием
Старый 05.11.2012, 10:47   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вот вы хорошо процитировли - теперь скажите, где во внутреннем while цикле изменяется i? Ответьте себе на вопрос, когда завершится этот цикл.

Кстати, не забывайте, что сочетание /* и */ может встречатся внутри текстовых строк: "hello /* */ world"
waleri вне форума Ответить с цитированием
Старый 05.11.2012, 10:48   #5
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Надо всего лишь написать i++, Вам же сказали выше.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 05.11.2012, 10:59   #6
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

На самом деле всё на много проще чем кажется, используй указатели это мощная вещь в надёжных руках.
Код:
#include <stdio.h>


char* erase_comment(char* s) {
	char* t = s;
	char* a, *b;

	for(a = b = s; *b; *b = *a) {
		if((*a == '/') && (*(a + 1) == '/')) {// удаление однострочных 

			for(a += 2; (*a) && (*a != '\n'); *a++);
			if(! *a) {
				*b = *a;
				break;
			}

		} else if((*a == '/') && (*(a + 1) == '*')) { // удаление многострочных

			for(a += 2; *a; *a++) {
				if((*a == '*') && (*(a + 1) == '/'))
					break;
			}
			if(! *a) {
				*b = *a;
				break;
			}
			*a++;

		} else
			*b++;
		*a++;
	}
	return t;
}



int main(){
	char s[] = "/*A*/int a = 10;//value\n//memory\n\n"\
		       "int b;/*7\n\n\n77*/\nshort s;/**/\n//MK";

	puts("SRC CODE:");
	puts(s);
	puts("DST CODE:");
	puts( erase_comment(s) );
    return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 05.11.2012, 11:01   #7
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

waleri, правильно подметил, стоит добавить в начало пропуск блока текста, это пускай автор добавляет как домашнее задание.
Nuklon вне форума Ответить с цитированием
Старый 05.11.2012, 11:42   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А в блоке текста еще надо будет следить за \"
waleri вне форума Ответить с цитированием
Старый 06.11.2012, 22:09   #9
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

Спасибо мужики, буду разбирать. Насчет указателей... вы верно подметили, "в надежных руках". К сожалению, я в их толком еще не понимаю... ну как, вроде более-менее понимаю, но вот самостоятельно использовать - очень трудно) А вот еще 1 вопрос: вроде в вашем коде все понятно, но как понять
Код:
if(! *a) {
				*b = *a;
				break;
я не понял. И break я так понял удаление символа?
Павел_95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расстановка комментариев Рустам_IMAN Помощь студентам 0 14.03.2012 23:06
Удаление комментариев из кода dab00 Microsoft Office Excel 9 17.08.2011 15:37
[C#] Удаление блочных комментариев AquaticSoul C# (си шарп) 7 10.11.2010 21:01
Добавление комментариев Amen PHP 9 20.10.2009 19:34