Выдать 0A в стандартный вывод. C.

Тема в разделе "WASM.BEGINNERS", создана пользователем DarkWanderer, 7 июн 2008.

  1. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    "\n" выдает в итоге 0D,0A. Если выводить символьную переменную, значение которой 0x0A, все равно будет два символа. Так вот, как разделить строки одним только символом 0A?
    --
    Решаю олимпиадную задачу с автоматической проверкой на сервере. В примере выходного файла строки разделены именно этим символом, нужно создавать такой же.
    Вот только странно, что все три варианта разделения нормально отображаются в far. С чего бы это?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    DarkWanderer
    как разделить строки одним только символом 0A?
    Надо установить для стандартного вывода бинарный режим. Для dos/win
    Код (Text):
    1. #include <stdio.h>
    2. #include <fcntl.h>
    3. #include <io.h>
    4.  
    5. int main(void)
    6. {
    7.   _setmode(_fileno(stdout), _O_BINARY);
    8.   fprintf(stdout, "\n");
    9.   return 0;
    10. }
    все три варианта разделения нормально отображаются в far. С чего бы это?
    Исходные тексты far'а доступны http://farmanager.com/svn/trunk/unicode_far.

    Три варианта - dos/win - \xD\xA, nix - \xA и mac - \xD?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    где-то читал, что там \xA\xD
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Можно ещё использовать cprintf вместо printf, он не вмешивается в выводимые данные. Или puts с sprintf.
     
  5. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    q_q
    ->Надо установить для стандартного вывода бинарный режим. Для dos/win
    Получилось, да. Но теперь на сервере не компилится. Даже библиотеки отключил, повыносив константу и прототип, все равно.
    ->Три варианта - dos/win - \xD\xA, nix - \xA и mac - \xD?
    Да, они. Исходники ковырять не буду пока, стану считать, что варианты укладываются в логику и в far'e предусмотрены.
    Vov4ick
    cprintf выводит только на дисплей, а нужно в стандартный поток, который может быть любым.

    --
    Читаю книгу "С. Скиена - Олимпиадные задачи по программированию", для проверки использую специально для книги созданный http://www.programming-challenges.com/ . Программа там вызывается что-то вида: program <infile >outfile.
    Во всех представленных примерах используется только printf и никакой смены режима. Компилятор - Lcc, какой у них - не знаю.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    DarkWanderer
    Опиши процедуру компиляции "на сервере" и почему выходной файл "нужно создавать такой же"?

    Компилятор - Lcc, какой у них - не знаю.
    lcc, A Retargetable Compiler for ANSI C?
     
  7. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    char str_out[256], str_in[]="string";
    int A=0xa;

    str_out[0]=0;
    strcat(str_out,str_in);
    strcat(str_out,(char*)&A);

    или

    int l=strlen(str_out);
    str_out[l]=0xa; str_out[l+1]=0;
     
  8. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    q_q
    ->Опиши процедуру компиляции "на сервере" и почему выходной файл "нужно создавать такой же"?
    Не знаю, как там компилируется. Есть web форма, куда можно скопировать исходник. Есть кнопка. Копируешь, жмешь, пишет скупой отчет - "wrong answer", "compiling error" и др. У меня выдает первый, значит, формат результатов не подходит.
    Как пишут, программа вначале компилируется, если без ошибок - запускается ряд тестов. В качестве входного и выходного потоков файлы. Затем файлы сверяются с эталонами.
    Примеры входных и выходных файлов можно скачать на том же сайте, мой выходной отличается только тем, что строки разделяются другими символами.

    lcc, A Retargetable Compiler for ANSI C?
    Кажется, нет. Но компилятор не принципиален.
    http://www.rsdn.ru/article/devtools/devtools.xml
    http://www.cs.virginia.edu/~lcc-win32/

    _basmp_
    Не пробовал еще так. Хотя должно быть стандартное решение, в примерах все так просто и аккуратно.

    --
    Может, у меня и правда, ответ неправильный выдает? Тестировал слабо, но ошибок не вижу. Задача простая, самая первая в книге.
    h**p://www.darkwanderer.nm.ru/file/3n+1.rar
     
  9. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Проблема в другом. Если программа компиляется на сервере, значит использует она "серверную" libc, и значит выводит в качестве терминатора строки именно \n, а не \r\n.
    Я представляю о чём ты говоришь (с аттачем лень связываться) -- там очень внимательно надо читать условие, и при написании программы всё время думать о том, как программа должна себя вести в специальных случаях.
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Ну а
    printf("%c",0xa);
    или
    printf("\x0а");
    разве не пройдет?
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _basmp_
    Твои попытки "обмануть" crtl наивны. Управляющие символы \n, \r, \t и т.п. характерны для исходного кода на Си. В объектном/исполняемом модуле они хранятся как числа - 0Ah, 0Dh, 09h. Добавление 0xD происходит в момент вывода 0xA, например, из исходных кодов crtl msvc6
    Код (Text):
    1. /* CRT\SRC\WRITE.C строки со 143 по 161*/
    2. ...
    3.         if ( _osfile(fh) & FTEXT ) {
    4.                 /* text mode, translate LF's to CR/LF's on output */
    5.  
    6.                 p = (char *)buf;        /* start at beginning of buffer */
    7.                 dosretval = 0;          /* no OS error yet */
    8.  
    9.                 while ( (unsigned)(p - (char *)buf) < cnt ) {
    10.                         q = lfbuf;      /* start at beginning of lfbuf */
    11.  
    12.                         /* fill the lf buf, except maybe last char */
    13.                         while ( q - lfbuf < BUF_SIZE - 1 &&
    14.                             (unsigned)(p - (char *)buf) < cnt ) {
    15.                                 ch = *p++;
    16.                                 if ( ch == LF ) {
    17.                                         ++lfcount;
    18.                                         *q++ = CR;
    19.                                 }
    20.                                 *q++ = ch;
    21.                         }
    22. ...
    DarkWanderer
    Но компилятор не принципиален.
    Не совсем так. Скорее всего твой код может использовать только ANSI C, а _setmode - это dos/win specific.

    Может, у меня и правда, ответ неправильный выдает?
    Что бы ответить на этот вопрос, надо знать на каких данных тестируется код. С кодировкой конца строки проблем быть не должно, т.к. ты отдаешь исходный текст, то завершения строк ставит их (серверный) компилятор.

    Твой код не безупречен.
    Например, у твоей программы ограничение на 32-ве пары чисел, или нигде не сказано, что числа в паре будут упорядочены по возрастанию, а у тебя
    Код (Text):
    1. ...
    2. for(K=Data[i]; K<=Data[I+1]; K++)
    3. ...
    .
     
  12. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    q_q
    вообще говоря, я никогда не интересовался в какой момент \n подменяется на 10 13. Но если это происходит именно в процедуре записи текста, то стоит попробовать спринтф и бинарную запись (приведеный сорец не оставляет выбора).
     
  13. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Полностью согласен с q_q. Спасибо.

    _basmp_
    я ошибался с конкретикой вопроса. Еще не дорешал, правда.
    --
    ACM - хорошая штука. И раз у меня принципиальные проблемы с самой простой из задач обязательно буду учавствовать в тренировках следующего года.
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    DarkWanderer
    Помню этот контест... пару лет назад решал задачки еще со старого сервера: http://acm.uva.es .
    Посмотрел Ваш исходник. Вообще совсем не обязательно (и даже нежелательно) сначала читать все входные данные, а потом только делать вывод. Поток ввода и поток вывода не коррелируют. Не рекомендовал бы использовать int... может в MSVC он и четырехбайтовый, но мало ли какой там компилятор. При работе с целыми числами в таких задачах лучше использовать unsigned long int или вообще __int64 (если не изменяет память, то для этого контеста он же long long). И самое главное! В задаче не сказано, что сначала идет меньшее число, а потом большее! Там сказано МЕЖДУ i и j.
    P.S. Не нужно извращаться с переходом на новую строку. \n там вполне нормально проходит.
     
  15. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Да, в коде были ошибки. Потом оптимизировать еще пришлось. Но решил и сервер принял.
    Кому не лень, прочитайте, где там еще некрасиво осталось.
    Код (Text):
    1. // 3n+1.
    2. // http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110101&format=html
    3. // @JUDGE_ID: 18321 110101 C
    4. // @BEGIN_OF_SOURCE_CODE
    5.  
    6. #include <stdio.h>
    7.  
    8. int GetCicleLength(int value)
    9. {
    10. int length=1; //cicle length
    11.     while(value!=1) {
    12.         if(!(value%2))
    13.             value/=2;
    14.         else {
    15.             value*=3;
    16.             value++;
    17.         }
    18.         length++;
    19.     }
    20. return length;
    21. }
    22.  
    23. int main()
    24. {
    25. int a; //
    26. int b; //
    27. int t;
    28. int K;    //index
    29. int maxL;     //
    30. int curL;     //
    31.  
    32.     while( scanf("%d %d",&a,&b)!=EOF ) {
    33.  
    34.         printf("%d",a);
    35.         printf(" ");
    36.         printf("%d",b);
    37.         if(a>b) { t=a; a=b; b=t; }
    38.         maxL=0;
    39.         for(K=a; K<=b; K++) {
    40.             curL=GetCicleLength(K);
    41.             if(curL>maxL)
    42.                 maxL=curL;
    43.         }
    44.         printf(" %d\n",maxL);
    45.     }
    46.  
    47. return 00;
    48. }
    49.  
    50. // @END_OF_SOURCE_CODE
     
  16. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    l_inc
    Использование int проходит. А когда и в чем он был слово?
    --
    Хотя да, перечитал сам весело стало, две строки и спрашиваю, что может быть не красивым. Получилось - похвастался;).
    Тогда не так. Каким извратом можно такой код оптимизировать еще? Ради интереса.
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    DarkWanderer
    Ну в первой задаче постарались только дать примерное представление о том, как решать подобные задачи, поэтому особо хитрых формулировок и особо хитрых тестов там не было. А Вы попробуйте 10655. Или может даже совсем простую 10642. Там уже не пройдет.
    В шестнадцатибитном компиляторе. :)
     
  18. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    l_inc
    А ведь и правда.. ;)
    Обязательно порешаю остальные. Первый курс прошел. Впереди целых четыре, а с тренером уже познакомился. Все к одному, выбора не остается;).