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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2012, 23:08   #1
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию Си. Коммандная строка.

Написать программу которая обеспечивает команду вида [имя команды]
[-a|-b][-o исходный файл],где –a и –b несовместимые флаги.
1. если задан флаг –а команда записывает в файл электронную почту.
2.если задан флаг –b команда записывает текущую папку в файл.
Полученная информация записывается в файл имя которого задается как аргумент опции
Вот код который я написал:
Код:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/sysinfo.h>
#include<fcntl.h>
int main(int argc, char *argv[])
 {
   int c;
   int aflg=0;
   int bflg=0;
   int flg='?';
   int errflg=0;
   char *ofile=NULL;
   int fd;
   char str[10];
   opterr=0;
   while ((c=getopt(argc,argv,"abo:"))!=-1)
     { switch(c)
       { 
         case 'a':aflg++;
                  flg=c;
		  if(bflg)
		      {fprintf(stderr,"флаги a и b несовместимы");
		       errflg++;}
                  break;
	 case 'b':bflg++;
                  flg=c;
 		  if(aflg)
		      {fprintf(stderr,"флаги a и b несовместимы");
 		       errflg++;}
 		  break;
         case 'o':ofile=optarg;
		  break;
	 case '?':errflg++;
		  fprintf(stderr,"Недопустимая опция - %c",optopt);
		  break;
	 case ':':errflg++;
		  fprintf(stderr,"Пропущен аргумет опции -%c",optopt);
                  break;
       }
     }
  if(errflg)
  {
      fprintf(stderr,"\nНеверный формат команды %s [-a|-b][-o аргумент][операнды]\n\n",argv[0]);
      exit(1);
  }
	printf("\n Задан флаг: %c",flg);
	printf("\n Аргумент опции: %s",ofile);
  	printf("\n Остаток коммандной строки : ");
     for(;optind<argc;optind++)
      printf("%s\n ",argv[optind]);

  fd=open(ofile,O_WRONLY|O_CREAT|O_TRUNC,0644);
   if(fd!=-1)
     {switch(flg)
      {case 'a':sprintf(str,"Почта: %s ",getenv("MAIL"));
		write(fd,str,strlen(str));
		printf("\nПочта записана в файл");
                break;
       case 'b':sprintf(str,"Текущий каталог: %s",getenv("PWD"));
		write(fd,str,strlen(str));
		printf("\n Текущий каталог записан в файл");
		break;
       }
     } else printf("\n Ошибка! Невозможно открыть файл %s.",ofile);
      return 0;
}
1) когда пытаюсь записать почту в файл то выбивает вот такое
Цитата:
*** stack smashing detected ***: ./RGZ terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0x9a1c75]
/lib/i386-linux-gnu/libc.so.6(+0xe8c27)[0x9a1c27]
./RGZ[0x80489ca]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x8d2113]
./RGZ[0x80485b1]
======= Memory map: ========
00246000-00247000 r-xp 00000000 00:00 0 [vdso]
00760000-0077e000 r-xp 00000000 08:07 260131 /lib/i386-linux-gnu/ld-2.13.so
0077e000-0077f000 r--p 0001d000 08:07 260131 /lib/i386-linux-gnu/ld-2.13.so
0077f000-00780000 rw-p 0001e000 08:07 260131 /lib/i386-linux-gnu/ld-2.13.so
008b9000-00a31000 r-xp 00000000 08:07 280357 /lib/i386-linux-gnu/libc-2.13.so
00a31000-00a33000 r--p 00178000 08:07 280357 /lib/i386-linux-gnu/libc-2.13.so
00a33000-00a34000 rw-p 0017a000 08:07 280357 /lib/i386-linux-gnu/libc-2.13.so
00a34000-00a37000 rw-p 00000000 00:00 0
00ac0000-00adc000 r-xp 00000000 08:07 261053 /lib/i386-linux-gnu/libgcc_s.so.1
00adc000-00add000 r--p 0001b000 08:07 261053 /lib/i386-linux-gnu/libgcc_s.so.1
00add000-00ade000 rw-p 0001c000 08:07 261053 /lib/i386-linux-gnu/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:07 569108 /home/linux/РГЗ/RGZ
08049000-0804a000 r--p 00000000 08:07 569108 /home/linux/РГЗ/RGZ
0804a000-0804b000 rw-p 00001000 08:07 569108 /home/linux/РГЗ/RGZ
08200000-08221000 rw-p 00000000 00:00 0 [heap]
b77da000-b77db000 rw-p 00000000 00:00 0
b77eb000-b77ee000 rw-p 00000000 00:00 0
bfe51000-bfe72000 rw-p 00000000 00:00 0 [stack]
Почта записана в файлАварийный останов
Почта действительно записывается в файл. На счёт ошибок, я искал и понял что это связано с переполнением стека.

2)При попытке записать текущий каталог в файл, то он записывается но все эти действия сопровождаются вот таким сообщением
Цитата:
*** stack smashing detected ***: ./RGZ terminated
Ошибка сегментирования
Помогите, пожалуйста, в решении этих проблем.
Антон Лысенко вне форума Ответить с цитированием
Старый 30.05.2012, 12:29   #2
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

В C не очень разбираюсь, но смущает в коде
Код:
char str[10];
Я так понимаю что Вы потом str присваиваете строки явно длинее 10

http://programmery.ucoz.ru/publ/c/ra...i_v_s/4-1-0-99
astecenko вне форума Ответить с цитированием
Старый 30.05.2012, 20:08   #3
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
В C не очень разбираюсь, но смущает в коде
Код:
char str[10];
Я так понимаю что Вы потом str присваиваете строки явно длинее 10

http://programmery.ucoz.ru/publ/c/ra...i_v_s/4-1-0-99
вот я ущербный. А ведь действительно так. Проглядел. Спасибо!
Ну тут ещё проблема нарисовалась: почта нормально записывается в файл. А вот при попытке записать каталог, появляется ошибка которая была раньше при флаге -а.
Антон Лысенко вне форума Ответить с цитированием
Старый 30.05.2012, 20:20   #4
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Антон Лысенко Посмотреть сообщение
вот я ущербный. А ведь действительно так. Проглядел. Спасибо!
Ну тут ещё проблема нарисовалась: почта нормально записывается в файл. А вот при попытке записать каталог, появляется ошибка которая была раньше при флаге -а.
Вот же я и болван..... Выделил ещё больше памяти под строку и все норм. Спасибо за направление на путь истинный!!)))
Антон Лысенко вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Коммандная строка alexdrew Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 06.05.2010 20:59
коммандная кнопка almarian Microsoft Office Word 0 25.03.2010 22:19
строка D_E_N Общие вопросы Delphi 2 03.01.2010 21:44
Коммандная строка Dr.Badnezz Общие вопросы Delphi 1 19.09.2008 16:53
Строка состаяния или загрузачная строка Sergeu Мультимедиа в Delphi 8 27.08.2008 10:32