Передача аргументов в главную функцию main().

————

Игорь Викторович, здравствуйте. Вас беспокоит ХХХХХХ , студент ХХХ группы. У меня не передается значение функции main. Прошу Вас помочь мне разобраться с моей проблемой. Задачник Абрамова задание  191. Спасибо.

#include <stdio.h>

void main(int argc,char *argv[])

{

 FILE *fp;

 int n, count=0, i, d;

 float *arr,var;

 l2: printf(«vyberite sposob zadaniya massiva\n 1)vruchnuyu\n 2)avtomat\n 3)iz fayla»);

 scanf(«%d»,&i);

 printf(«vvedite colichestvo elementov massiva %d %s»,argc,argv[1]);

 scanf(«%d»,&n);

 switch(i)

 arr=malloc(sizeof(float)*n);

 n—;

 switch(i)

 {

  case 1:

  {

   for(i=0;i<=n;i++)

   {

    scanf(«%f»,&var);

    arr[i]=var;

   }

   break;

  }

  case 2:

  {

   for(i=0;i<=n;i++) arr[i]=rand();

   break;

  }

  case 3:

  {

   fp=fopen(argv[1],»r»);

   i=0;

   while(!feof(fp))

   {

    fscanf(fp,»%f»,&var);

    arr[i]=var;

    i++;

    if (i>n) break;

   }

   fclose(fp);

   break;

  }

  default:

  {

   printf(«\nvyberite odin iz dvuh punktov»);

   goto l2;

  }

 }

 for (i=0;i<=n;i++)

 {

  printf(«%f\t»,arr[i]);

  if(arr[i]>=7) { count++; arr[i]=7;}

 }

 printf(«\nkolichestvo elementov, ravnyh bolee 7 = %d»,count);

 sleep(5);

}

————————————————————-

    Так как ответ может быть интересен всем, а не только человеку, приславшему мне письмо, то привожу этот ответ в своем блоге. Известно, что функция main может иметь аргументы, хотя очень часто потребность в них отсутствует, а в программе функцию main записываем без аргументов, то есть main().

На лекции я приводил следующую программу.

#include<stdio.h>

#include<conio.h>

main(argc,argv)

int argc;

char *argv[];

{clrscr();

printf(«\n agrc=%d»,argc);

while(argc>0) {

printf(«\n argc=%d argv[]=%s»,argc,*argv);

*argv++;

argc—;} }

Если программу скомпилировать и запустить (полученный в результате компиляции файл называется str.exe и находится на диске C: в папке TC)  в командной строке, указав str.exe /HELP /AIV, то программа напечатает:

 agrc=3

 argc=3 argv[]=C:\TC\STR.EXE

 argc=2 argv[]=/HELP

 argc=1 argv[]=/AIV

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

Какая ошибка в программе, связанная с обработкой передаваемого имени файла, мне достаточно очевидно. Надеюсь, что это будет очевидно и все читателям, после рассмотрения того, как работает приведенная ниже программа. Программа должна найти сумму всех элементов, записанных в файле 1.txt. В первой строке файла находится информация о том, сколько всего элементов будем суммировать, а далее эти элементы. Пример содержимого файла 1.txt:

6

11.3

11.7

1

2

3

4

Сложив числа, получим ответ 33. Пусть наша программу будет называться mainsum.c. Откомпилированный exe файл будет находиться в папке tc на диске H:. Файл 1.txt помещен там же.

Запускаем консоль (Например, кнопка Пуск, выполнить, cmd).

Если находимся в той же папке, то вполне можно записать

mainsum 1.txt

или

mainsum  h:\tc\1.txt

Ecли в другой, то прописываем полный путь

h:\tc\mainsum  h:\tc\1.txt

И получаем нужный результат. Внимание! Не надо записывать

mainsum  h:\\tc\\1.txt

Да, С и С++ обратная косая черта служебный символ и ее надо удваивать если хотим получить обратную косую черту в записи текста программы.

Например, in=fopen(“c:\\tc\\1.txt”,”rt”); — записано правильно, а in=fopen(“c:\tc\1.txt”,”rt”); — с ошибкой.

Когда запускаем готовый exe файл, то обратную косую черту в записи пути удваивать не надо!

Текст программы:

#include<stdio.h>

#include<conio.h>

#include<alloc.h>

main(int x, char *f[])

{FILE *in;

int n,i;

float sum=0, tmp;

float *a;

printf(«\n x=%d»,x);

printf(«\n x=%d  f=%s»,x,*f);

printf(«\n x=%d  f[0]=%s»,x,f[0]);

printf(«\n x=%d  f[1]=%s»,x,f[1]);

printf(«\n x=%d  f[1]=%s»,x,*++f);

printf(«\n x=%d  f[1]=%s»,x,f[1]);

printf(«\n x=%d  f[1]=%s»,x,*—f);

printf(«\n x=%d  f[1]=%s»,x,f[1]);

in=fopen(f[1],»r»);

fscanf(in,»%d»,&n);

printf(«\n n=%d»,n);

a=calloc(n,sizeof(float));

printf(«\n float=%d»,sizeof(float));

for(i=1;i<=n;i++)

{fscanf(in,»%f»,&tmp);

a[i]=tmp;

printf(«\n a[%d]=%5.2f»,i,a[i]);

sum=sum+a[i];

}

printf(«\n Sum=%5.2f»,sum);

fclose(in);

 }

И результаты ее тестирования:

 

Обратите внимание на то, что происходит, когда печатаю значение  printf(«\n x=%d  f[1]=%s»,x,f[1]);. Видите, что строка

printf(«\n x=%d  f[1]=%s»,x,*f);

появилась не случайно. Это грабли номер два, на которые можно налететь (первые — это ошибочное удваивание символа \). Двигаемся дальше. Замечу, что конструкция

fscanf(in,»%f»,&tmp);

a[i]=tmp;

использована сделана исключительно потому, что turbo C (ver 2.0 и ниже) не всегда корректно работает с вводимыми элементами массива. Для используемого языка С++ можно было записать fscanf(in,»%f»,&a[i]);

Рекомендую скачать архив https://mctrewards.ru/stud/main.zip и посмотреть программы в работе.

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

Вопросы по программированию Вы можете задавать в теме Вопросы по программированию. После модерации к показу допускаются все вопросы по теме, а на наиболее интересные я даю ответы. При желании любой читатель тоже может дать ответ на заданный вопрос.

Ананченко Игорь Викторович Контактная информация Моб. телефон: +79213201586 ICQ: 361916132 Веб-сайт: http://anantchenko.ru E-mail: igor@anantchenko.ru Вконтакте: http://vkontakte.ru/id8574436 https://mcp.microsoft.com/authenticate/validatemcp.aspx Transcript ID 793398 and the Access Code 9213201586 Microsoft Certification Status: Microsoft Certified IT Professional, Microsoft Certified Technology Specialist, Microsoft Certified Desktop Support Technician, Microsoft Certified Professional, Microsoft Certified Trainer