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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 23:06   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Действительно можно, но я не видел чтобы кто-то так рекомендовал делать. По-моему это только ухудшает читаемость программы и создает путанницу. Лучше так не делать.
Согласен. Буду предварительным просмотром теперь пользоваться
8Observer8 вне форума Ответить с цитированием
Старый 08.12.2011, 23:21   #12
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Условие (c = *++argv[0]) выполняется всегда, т.к. это не проверка, а присваивание.
JuniorProger вне форума Ответить с цитированием
Старый 08.12.2011, 23:45   #13
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

думаю надо так
Код:
...........	
    while ((--argc > 0) && ((*argv[0]) == '-')){
        c = *++argv[0];
        switch (c) {
			case 'x':
				except = 1;
				break;
			case 'n':
                number = 1;
                break;
            default:
                printf("find: illegal option %c\n", c);
                argc = 0;
                found = -1;
                break;
		};
	};
		if (argc != 1).......
JuniorProger вне форума Ответить с цитированием
Старый 09.12.2011, 10:07   #14
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

> to JuniorProger
Цитата:
Условие (c = *++argv[0]) выполняется всегда, т.к. это не проверка, а присваивание.
Не согласен, вот пример:
Код:
#include <stdio.h>

int main () {
    int c;

    char* argv[] = {"abcdef", "567"};

    while (c = *++argv[0]) {
        printf("%c", c);
    }
    printf("\n");

    return 0;
}
Цикл while заканчивает работу, когда с == '\0'

Последний раз редактировалось 8Observer8; 09.12.2011 в 10:10.
8Observer8 вне форума Ответить с цитированием
Старый 09.12.2011, 10:50   #15
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

ТС, о чем вы вообще говорите? Пример из книги, без всяких исправлений, прекрасно компилируется.
http://codepad.org/FCILMdmk
Вы можете объяснить, что вас конкретно не устраивает.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 09.12.2011, 11:09   #16
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

> to Blade
Цитата:
ТС, о чем вы вообще говорите? Пример из книги, без всяких исправлений, прекрасно компилируется.
http://codepad.org/FCILMdmk
Вы можете объяснить, что вас конкретно не устраивает.
Да, он компилируется, но ошибка возникает при запуске программы из командной строки. Точнее, когда я набираю строку и нажимаю ENTER, чтобы ввести другую строку, выскакивает сообщение, что обнаружена ошибка.
Цитата:
Сообщение от JuniorProger Посмотреть сообщение
думаю надо так
Код:
...........	
    while ((--argc > 0) && ((*argv[0]) == '-')){
        c = *++argv[0];
        switch (c) {
			case 'x':
				except = 1;
				break;
			case 'n':
                number = 1;
                break;
            default:
                printf("find: illegal option %c\n", c);
                argc = 0;
                found = -1;
                break;
		};
	};
		if (argc != 1).......
К сожалению, это неверно. Здесь должно быть два цикла. Внешний цикл передвигается по ключам (через символы '-'), а внутренний по символам после символа '-' Это для того, чтобы мы могли вводить, как find -x -n образец, так и find -xn образец.

Я ещё попробовал заменить строку:
int main (int argc, char* argv[]) {
на строку:
int main (int argc, char** argv) {
Всё равно не работает.

Последний раз редактировалось 8Observer8; 09.12.2011 в 11:24.
8Observer8 вне форума Ответить с цитированием
Старый 09.12.2011, 11:50   #17
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я нашёл эту книгу на английском. Пример работает. Пока не понял почему работает и где была ошибка.
Код:
    // find_eng.c

   #include <stdio.h>
   #include <string.h>
   #define MAXLINE 1000

   int getline(char *line, int max);

   /* find: print lines that match pattern from 1st arg */
   main(int argc, char *argv[])
   {
       char line[MAXLINE];
       long lineno = 0;
       int c, except = 0, number = 0, found = 0;

       while (--argc > 0 && (*++argv)[0] == '-')
           while (c = *++argv[0])
               switch (c) {
               case 'x':
                   except = 1;
                   break;
               case 'n':
                   number = 1;
                   break;
               default:
                   printf("find: illegal option %c\n", c);
                   argc = 0;
                   found = -1;
                   break;
               }
       if (argc != 1)
           printf("Usage: find -x -n pattern\n");
       else
           while (getline(line, MAXLINE) > 0) {
               lineno++;
               if ((strstr(line, *argv) != NULL) != except) {
                   if (number)
                       printf("%ld:", lineno);
                   printf("%s", line);
                   found++;
               }
           }
       return found;
   }

/* getline: считывает строку в s */
int getline(char* s, int lim) {
    int c, i;

    for (i = 0; i<lim-1 && (c = getchar()) != EOF && c != '\n'; i++) {
        s[i] = c;
    }

    if (c == '\n') {
        s[i++] = c;
    }
    s[i] = '\0';

    return i;
}
8Observer8 вне форума Ответить с цитированием
Старый 09.12.2011, 12:23   #18
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Всем, спасибо! Тему можно закрывать. Понял в чём ошибка.

Надо заменить строку:
if ((strstr(line, argv[argc]) > 0)) {
На строку:
if ((strstr(line, *argv) != NULL) != except) {
8Observer8 вне форума Ответить с цитированием
Старый 09.12.2011, 16:03   #19
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Поторопился я с закрытием темы. Остались "непонятки". Поясните кто-нибудь, пожалуйста, почему конструкция (*++argv)[0] (из предыдущего кода) работает, а по-моему не должна. Вот пример, где она не работает:
Код:
#include <stdio.h>
#include <string.h>

int main() {
    char* argv[] = {"abc", "123"};

    (*++argv)[0];

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 09.12.2011, 21:11   #20
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Что ты хочешь получить этой конструкцией (*++argv)[0] ?

Если надо букву b, то надо сделать так *(++argv[0]) или *++argv[0] (первый вариант понятнее). Если число 3, то *(++(++argv[1])) или *++(++argv[1]).
Т.е. сначала выбираешь элемент массива argv: argv[0] = "abc" (указатель на букве а) , argv[1] = "123" (указатель на цифре 1).
Затем сдвигаешь указатель операцией ++: ++argv[0] = "bc" (указатель перешел на b), ++(++argv[0]) = "c"(указатель перешел на с), (++argv[1]) = "23".
Если нужно получить конкретное значение, например 2, то добавляешь * : *(++argv[1]) = "2".
Думаю понятно объяснил.

Последний раз редактировалось JuniorProger; 10.12.2011 в 21:06.
JuniorProger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при установке KOL&MSK DKENT Компоненты Delphi 0 21.09.2011 10:36
Ошибка c AnsiChar & Char Яр|/||< (^_^) Общие вопросы Delphi 3 19.02.2010 21:22
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
EMS InterBase & FireBird Manager 3 ошибка создания Базы данных Gilio БД в Delphi 2 08.05.2009 15:59