Консультация № 185957
03.05.2012, 16:30
94.84 руб.
0 7 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Программа на С.

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

Обсуждение

давно
Профессор
399103
482
03.05.2012, 21:18
общий
это ответ
Здравствуйте, Посетитель - 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;
}
Неизвестный
04.05.2012, 18:27
общий
можно внести ещё некоторые дополнения в программу: 1)нужно сделать защиту от рекурсии 2) нужно чтобы программа закрывалась по поручению пользователя.к примеру "для выхода нажмите 1" "для повторного ввода строки нажмите 2"
3)и последнее, к примеру нужно чтобы при вводе строки calc.exe, открывался калькулятор
давно
Профессор
399103
482
06.05.2012, 02:49
общий
06.05.2012, 02:51
Дописал. Про повторный ввод строки, правда, не понятно. Про calc.exe и того не понятнее. То, что запустится при наборе calc.exe зависит от наличия calc.exe в папке с программой, в PATH или где ещё в системе прописано, как реагировать на консольные команды. Может, на компьютере вообще кроме ОС, компилятора, да этой программы ничего нет. У меня вот калькулятор запускается :)

PS. Почему бы не писать требования сразу? Вам преподаватель, что ли, дополнительные задания выдаёт?
Неизвестный
06.05.2012, 12:04
общий
06.05.2012, 12:07
нужно чтобы программа завешала работу по просьбе пользователя, по командам,для выхода введите - 1 либо для повторного набора символьной строки введите - 2, чтобы можно было ещё раз программу прогнать.
по поводу calc.exe, преподователь сказал что программа должны искать файлы не только которые расположены в папке самой программы, но и к примеру в других папках, как пример должен запускаться калькулятор)

PS. скажем так не дополнительные задания, а поправки
давно
Профессор
399103
482
06.05.2012, 12:37
общий
06.05.2012, 12:37
Про просьбы к пользователю добавил.

Цитата: 393219
программа должны искать файлы не только которые расположены в папке самой программы, но и к примеру в других папках

Это в каких-таких других? Как бы то ни было, даже в простейшем варианте - делать поиск по дереву каталогов, начиная с текущего, на голом C - задача по трудоёмкости не сравнимая и с десятью начальными. Это он пошутил, наверное. Передайте, что я посмеялся. Впрочем, может есть консольная команда, делающее это и надо лишь её вызвать, но в существовании оной я сильно сомневаюсь.

Цитата: 393219
PS. скажем так не дополнительные задания, а поправки

Нуу даа, которые, по сути, являются дополнительными заданиями. Обратите внимание, код вдвое вырос, по сравнению с исходной версией. Даже если поправки пустяковые, гораздо приятнее видеть их в начальной(и единственной, чёткой) формулировке задания. Не говоря уже о том, когда поправка на порядок сложнее исходной задачи.
Неизвестный
06.05.2012, 12:43
общий
Благодарю. По поводу экзешников в других папках, я думаю покажу ему calc.exe и он отстанет, если запуститься конечно.
давно
Профессор
399103
482
06.05.2012, 12:46
общий
Так я ж говорю - system "набирает в консоли" то, что ввёл пользователь. Откройте консоль: пуск->выполнить->cmd (у вас Windows, как я понимаю). И там пишите calc или ещё что-то. Если там запустилось - запустится и из программы.
Форма ответа