Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 10413
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3992
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2482
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1740
Дата выхода:06.05.2012, 17:00
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:144 / 94
Вопросов / ответов:1 / 1

Консультация # 185957: Здравствуйте! У меня возникли сложности с таким вопросом: Программа на С. Ввести с клавиатуры символьную строку. Проверить может ли являться строка именем экзешного файла(exe) (наличие в строке .exe) . В именах не может быть скобок т.е. имя файла не может содержать недопустимых символов, если содержит недопустимые символы либо не является...


Консультация # 185957:

Здравствуйте! У меня возникли сложности с таким вопросом:
Программа на С.

Ввести с клавиатуры символьную строку. Проверить может ли являться строка именем экзешного файла(exe) (наличие в строке .exe) . В именах не может быть скобок т.е. имя файла не может содержать недопустимых символов, если содержит недопустимые символы либо не является именем файла, то вывести сообщение об ошибке, если может являться, то обнаружить и открыть его(экзешник). программа должна содержать комментарии и приглашения.

Дата отправки: 03.05.2012, 16:30
Вопрос задал: Посетитель - 393219 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Александр Чекменёв {vanger} (Профессор):

Здравствуйте, Посетитель - 393219!

Код :
#include <stdio.h>	// для printf/scanf
#include <string.h>	// для strstr
#include <stdlib.h>	// для system

#include <locale.h>	// для setlocale

int isTryingToExecuteOurselves( char str[], char fileNameVerbose[] )
{
	const char DELIM = '\\';	// подразумеваем, что разделителем в системе является такой слэш: \

	char* buf;
	char* delimLastOccurence;

	int res = 0;

	// если имя файла имеет вид "D:\MyCoolProg\zzz.exe"
	if( 0 == strcmp( str, fileNameVerbose ) ) return 1;

	// есть ли слэш
	delimLastOccurence = strrchr( fileNameVerbose, DELIM );
	if( 0 != delimLastOccurence )
	{
		buf = (char*)malloc( (strlen(fileNameVerbose) + 1) * sizeof(char) );

		// отрезаем "D:\MyCoolProg\", приводя к виду "zzz.exe"
		strcpy( buf, delimLastOccurence + 1 );
		// и проверяем, не "zzz.exe" ли ввёл пользователь
		if( 0 == strcmp( str, buf ) ) res = 1;

		free( buf );
	}

	return res;
}

int	main( int argc, char *argv[] )
{
	const char STOP_STRING[] = "exit";

	const int BUF_SIZE = 64;	// размер буфера под строку
	char str[BUF_SIZE];	// строка

	setlocale( LC_ALL, "Russian" );	// чтобы нормально выводилась кириллица. может и без этой строчки работать

start:

	printf( "Введите имя файла(%s для выхода): ", STOP_STRING );
	scanf( "%s", str );

	if( 0 == strcmp( str, STOP_STRING ) )
	{
		//return 0;
		goto end;
	}

	// проверяем, является ли введённая строка допустимым именем файла
	if( 0 == strstr( str, ".exe" ) ||	// если не содержит .txt
		0 != strstr( str, "(" ) ||		// или содержит (
		0 != strstr( str, ")" ) )		// или )
	{									// то считаем, что такое имя файла недопустимо
		printf( "Введённая строка не является допустимым именем файла\n" );
		//return 0;
		goto end;
	}

	// проверяем, не пытаемся ли запустить себя
	if( isTryingToExecuteOurselves( str, argv[0] ) )
	{
		printf( "Предотвращён запуск себя\n" );
		//return 0;
		goto end;
	}

	// вызываем системную функцию, записанную в str
	// это эквивалентно набору в консоли содержимого str и нажатию Enter
	// в нашем случае str имеет вид "zzz.exe"
	printf( "Запускаем %s\n", str );
	system( str );

end:

	printf( "Для повторной работы введите 1(что угодно другое для выхода): " );
	scanf( "%s", str );
	if( 0 == strcmp( str, "1" ) )
		goto start;

	return 0;
}

Консультировал: Александр Чекменёв {vanger} (Профессор)
Дата отправки: 03.05.2012, 21:18
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное