LINUX.ORG.RU

while, все что после не работает


0

0

дурацкий вопрос, у меня вот такой цикл с ключами, почему он не работает?
int main(){
....
print("test\n");
             while(argv[i] != NULL){
                         if(strcmp(argv[i] , "-h") == 0){
                                      usage(argv[0]);
                         }else if(strcmp(argv[i] , "-d") == 0){
                                      delay = atoi(argv[++i]);
                         }else if(strcmp(argv[i] , "-n") == 0){
                                     number = atoi(argv[++i]);
................
                         }else{
                                      printf("Invalid option.\n"); 
                                      usage(argv[0]);
                         }//if
                    i++;
printf("test1\n");
                 }//while
printf("test2\n");
.....
}//main

test и test1 вижу, а test2 нет(

и подскажите за одно как лучше всего опции оформлять?
кейсы мне не подходят, может быть больше 1 опции.
anonymous

>test и test1 вижу, а test2 нет(
Всё тут правильно, у меня работает

Только не надо:
printf("Invalid option.\n");
а то у тебя будет выдаваться мессага об ошибке
на значениях после -d и -n.

>и подскажите за одно как лучше всего опции оформлять?

почитай какой-нибудь сырец, заодно и мудрости наберешься

borodun
()
Ответ на: комментарий от anonymous

>Два раза за шаг цикла увеличивается i.
Так и будет, тк ты i++ в конце тела цикла пишешь
и инкремент в number = atoi(argv[++i]);

borodun
()

>> while(argv[i] != NULL){

Чему изначально равно i? Надеюсь что 1 =).

>> delay = atoi(argv[++i]);

А что если ожидаемого аргумента нет и argv[++i] == NULL?

>> test и test1 вижу, а test2 нет(

Что имеется в виду? Программа а) зависает в цикле, б) падает до test2, в) завершается вроде номально, но test2 не выводится?

>> и подскажите за одно как лучше всего опции оформлять?

Самый простой вариант: getopt. Или можно поискать какие-нибудь библиотеки.

Deleted
()
Ответ на: комментарий от Deleted

>Или можно поискать какие-нибудь библиотеки.

Блджад, какие библиотечки? Юзать getopt, читать исходники и ESR с его книгой про UNIX. Многое поймешь. Хотя не пойму, зачем он Plan 9 поливает грязью, аргументируя это тем, что UNIX работает, хотя и ужасен. Про UNIX пишет хорошо, а остальное не понимает =(

anonymous
()
Ответ на: комментарий от anonymous

>> Блджад, какие библиотечки? Юзать getopt

Во-первых, getopt не умеет длинные опции (а getopt_long* - это расширение GNU). Во-вторых, его нет в венде.

>> читать исходники и ESR с его книгой про UNIX. Многое поймешь.

Что такое ESR и зачем мне читать его книгу по UNIX 8)?

Deleted
()
Ответ на: комментарий от Deleted

> Что такое ESR и зачем мне читать его книгу по UNIX 8)?

Это такой кичливый индюк от open source. Написал книгу ни о чём, которая, ествественно, стала библией luserов.

anonymous
()
Ответ на: комментарий от anonymous

А чем оно лучше старого-доброго popt?

anonymous
()
Ответ на: комментарий от dimon555

->добавь в цикл, что-то вроде printf("%d\t%s\n", i, argv[i])
сенк это помогло понять почему же все не работает=)
вот если я делаю несколько типов, а определяю в main, то так не работает
глобально определять нельзя, ну или как тогда передать аргумент?
void create(){
add.point->(&data);
}

int main(int argc , char *argv[]){
argv[1] = (char *)data;
}

anonymous
()
Ответ на: комментарий от Deleted

> Что такое ESR

мантэйнер жаргон файла последних лет 15

anonymous
()
Ответ на: комментарий от anonymous

>> вот если я делаю несколько типов, а определяю в main, то так не работает
>> глобально определять нельзя, ну или как тогда передать аргумент?

>> void create(){

>> add.point->(&data);

>> }

>>

>> int main(int argc , char *argv[]){

>> argv[1] = (char *)data;

>> }


/me ниасилил сей поток мыслей.

Deleted
()
Ответ на: комментарий от anonymous

argv[1] = &data
если data указатель на char
argv[1] = data

но только, ты же сам понимаешь, что argv, это char **argv, т.е. он указывает на массив указателей длиной argc, а каждый указатель указывает на строку, которая аргумент и заканчивается \0

запускай прогу
$proga arg1 arg2

dimon555 ★★★★★
()
Ответ на: комментарий от anonymous

> Это такой кичливый индюк от open source. Написал книгу ни о чём, которая, ествественно, стала библией luserов.

Толсто. Он ее не написал, а собрал по сути. А про его мнение я уже высказался — необоснованно поливает грязью Plan 9.

anonymous
()
Ответ на: комментарий от anonymous

> зачем он Plan 9 поливает грязью

Сдаётся мне, что ты болтаешь. На страницах, посвящённых обзору План 9, Эрик про эту систему не написал ничего плохого. Можешь привести цитату в подтверждение своих слов?

Sphinx ★★☆☆
()

#include <getopt.h>
#include <stdio.h>

int main()
  int c;
  while(optind != argc) {
    c = getopt(argc, argv, "d:hn:");
    switch (c) {
      case 'd':
        delay = atoi(optarg);
        break;
      case 'h':
        usage(argv[0]);
        break;
      case 'n':
        number = atoi(optarg);
        break;
	    default:
	      printf("Invalid option.\n");
	      usage(argv[0]);
	      break;
    }
  }
}

Примерно так.

twosev ★★
()

Это кто это так тебя учил разбирать командную строку?
По простому надо всё делать, а не крутость свою показывать "знанием"
 инкрементов и того, что в конце argv лежит NULL (кстати в каком 
стандарте это описано?).

for (i = 0; i < argc; ++i) {
   if (strcmp(argv[i], "--flag1")) {
         flag1 = 1;
   } else if (strcmp(argv[i], "--opt1")) {
        if (i < argc - 1) {
             opt_value = argv[i + 1]
        } else {
             usage(argv[0]);
        }
   }
 ....
}

Reset ★★★★★
()
Ответ на: комментарий от Reset

>> кстати в каком стандарте это описано?

ISO/IEC 9899:1999

5.1.2.2.1 Program startup

...

— argv[argc] shall be a null pointer.

...

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.