Вопросы и ответы по программированию.
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
Госпаде. Твой пример -- месиво какое-то. Компилятор должен ругать тебя за такое. Да и здравый смысл.
Если в учебнике мешают код на С и код на С++, то это плохой учебник
Если в учебнике мешают код на С и код на С++, то это плохой учебник
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
- nameless noob
- Полковник
- Сообщения: 1682
- Зарегистрирован: 01.09.2010
- Откуда: Россия
- Благодарил (а): 21 раз
- Поблагодарили: 56 раз
- Контактная информация:
NiGHt-LEshiY
а в C read будет работать?
все вопросы к codeblocks, почему он меня не ругает
а в C read будет работать?
все вопросы к codeblocks, почему он меня не ругает
-
- Капитан
- Сообщения: 492
- Зарегистрирован: 23.05.2010
- Благодарил (а): 14 раз
- Поблагодарили: 43 раза
- Контактная информация:
"Потоки" в С++ - одна из самых мерзких вещей, которые мне только приходилось видеть.
- nikit-xxx
- Лейтенант
- Сообщения: 208
- Зарегистрирован: 28.11.2007
- Благодарил (а): 44 раза
- Поблагодарили: 5 раз
nameless noob
read() не пашет, потому что это нестатическая функция-член(нестатический метод) -- то есть она применяется только к объекту. не самый наглядный, но всё же пример
то есть чтобы не ругался компилятор надо писать что-то вроде
char *ap = new char[100];
cin.read(ap, 100);
// здесь какие-то попытки работы с массивом ap
delete[] ap;
Посмотри описание функции у Страуструпа - она не считывает один символ, она считывает не более 100 символов в область памяти по адресу ap, не добавляя терминальный нуль '\0' в конец... Из-за отсутствия '\0' среди ap[0]...ap[99] с ap нельзя работать как с C-строкой.(конечно, может быть '\0' там окажется случайно, или же при выходе за ap[99] тебе повезёт и программа при printf("%s", ap) не обвалится -- но так делать не надо)
Скорее всего, тебе нужна другая функция.
read() не пашет, потому что это нестатическая функция-член(нестатический метод) -- то есть она применяется только к объекту. не самый наглядный, но всё же пример
то есть чтобы не ругался компилятор надо писать что-то вроде
char *ap = new char[100];
cin.read(ap, 100);
// здесь какие-то попытки работы с массивом ap
delete[] ap;
Посмотри описание функции у Страуструпа - она не считывает один символ, она считывает не более 100 символов в область памяти по адресу ap, не добавляя терминальный нуль '\0' в конец... Из-за отсутствия '\0' среди ap[0]...ap[99] с ap нельзя работать как с C-строкой.(конечно, может быть '\0' там окажется случайно, или же при выходе за ap[99] тебе повезёт и программа при printf("%s", ap) не обвалится -- но так делать не надо)
Скорее всего, тебе нужна другая функция.
Последний раз редактировалось nikit-xxx 26.10.2012, 22:22, всего редактировалось 2 раза.

- Monk
- VIP
- Сообщения: 4713
- Зарегистрирован: 21.11.2009
- Благодарил (а): 418 раз
- Поблагодарили: 1053 раза
- Контактная информация:
А ты писал на каком нибудь извращении, типа пролога или лиспа? :DDeus_Ex_Machina писал(а):"Потоки" в С++ - одна из самых мерзких вещей, которые мне только приходилось видеть.
- nikit-xxx
- Лейтенант
- Сообщения: 208
- Зарегистрирован: 28.11.2007
- Благодарил (а): 44 раза
- Поблагодарили: 5 раз
сдал на отл, так и не поняв как он по хитрому работает(препод нам объяснял как он из фактов ищет решение, но после 2-3 итерации мозг впадал в ступор)Monk писал(а):пролога

- Monk
- VIP
- Сообщения: 4713
- Зарегистрирован: 21.11.2009
- Благодарил (а): 418 раз
- Поблагодарили: 1053 раза
- Контактная информация:
Дикая штука, я сдавал за всю группу, но не сказал бы, что хоть что-то понял.
- nameless noob
- Полковник
- Сообщения: 1682
- Зарегистрирован: 01.09.2010
- Откуда: Россия
- Благодарил (а): 21 раз
- Поблагодарили: 56 раз
- Контактная информация:
:shock:nikit-xxx писал(а):то есть чтобы не ругался компилятор надо писать что-то вродеchar *ap = new char[100];cin.read(ap, 100); // здесь какие-то попытки работы с массивом apdelete[] ap;Посмотри описание функции у Страуструпа - она не считывает один символ, она считывает не более 100 символов в область памяти по адресу ap, не добавляя терминальный нуль '\0' в конец... Из-за отсутствия '\0' среди ap[0]...ap[99] с ap нельзя работать как с C-строкой.(конечно, может быть '\0' там окажется случайно, или же при выходе за ap[99] тебе повезёт и программа при printf("%s", ap) не обвалится -- но так делать не надо)
и как мне считывать по одному числу за раз, расположенному между двумя слешами или пробелами?
- nikit-xxx
- Лейтенант
- Сообщения: 208
- Зарегистрирован: 28.11.2007
- Благодарил (а): 44 раза
- Поблагодарили: 5 раз
Если надо считать 5 таких строк
Добавлено спустя 1 минуту 20 секунд:
да, лучше не использовать одновременно C и C++ системы ввода-вывода
Добавлено спустя 4 минуты 33 секунды:
Здесьможно нужно почитать про C
http://yadi.sk/d/kaDPePH303dd K&R
http://yadi.sk/d/exqc6xcx03dh K&R
http://yadi.sk/d/Eov1Bf7D03df Шилдт
http://cpp.com.ru/shildt_spr_po_c/index.html Шилдт online
Добавлено спустя 36 минут 8 секунд:
или так с break, хотя его не любят
- 1//2
- 3// 4
- 5 //6
- 7 // 8
- 9 //
10
Код: Выделить всё
#include <stdio.h>
int main(void)
{
int i;
int status=1;//здесь надо инициализировать, чтобы в status не оказался "мусор", равный EOF
for(i=0; i<5 && status!=EOF; ++i){//проходим цикл до первой встречи EOF, но не более 5-и итераций
int xx, xy;
printf("\ni=%d. put xx // yy: ", i);
status = scanf(" %d // %d", &xx, &xy);
printf("status=%d; xx=%d, xy=%d\n", status, xx, xy);
if(status!=2 && status!=EOF){
printf("error. clearing stdin ...\n");
while(getchar()!='\n'){}//очищаем поток stdin до символа '\n' включительно('\n' добавляется в поток при нажатии Enter)
}
}
return 0;
}
да, лучше не использовать одновременно C и C++ системы ввода-вывода
Добавлено спустя 4 минуты 33 секунды:
Здесь
http://yadi.sk/d/kaDPePH303dd K&R
http://yadi.sk/d/exqc6xcx03dh K&R
http://yadi.sk/d/Eov1Bf7D03df Шилдт
http://cpp.com.ru/shildt_spr_po_c/index.html Шилдт online
Добавлено спустя 36 минут 8 секунд:
или так с break, хотя его не любят
Код: Выделить всё
#include <stdio.h>
int main(void)
{
int i;
int status;
for(i=0; i<5; ++i){//проходим цикл до первой встречи EOF, но не более 5-и итераций
int xx, xy;
printf("\ni=%d. put xx // yy: ", i);
status = scanf(" %d // %d", &xx, &xy);
printf("status=%d; xx=%d, xy=%d\n", status, xx, xy);
if(status==EOF)
break;
if(status!=2){
printf("error. clearing stdin ...\n");
while(getchar()!='\n'){}//очищаем поток stdin до символа '\n' включительно('\n' добавляется в поток при нажатии Enter)
}
}
return 0;
}

-
- Капитан
- Сообщения: 492
- Зарегистрирован: 23.05.2010
- Благодарил (а): 14 раз
- Поблагодарили: 43 раза
- Контактная информация:
Если твой мозг не может выйти за пределы императивной парадигмы, то это твои проблемы, а не языков.Monk писал(а):А ты писал на каком нибудь извращении, типа пролога или лиспа? :D
- Monk
- VIP
- Сообщения: 4713
- Зарегистрирован: 21.11.2009
- Благодарил (а): 418 раз
- Поблагодарили: 1053 раза
- Контактная информация:
Deus_Ex_Machina
если тебе не нравятся потоки в с++, это тоже твои проблемы.
если тебе не нравятся потоки в с++, это тоже твои проблемы.
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
Deus_Ex_Machina
Ну-ну.. Можно посмотреть на то, что за пределами "императивной парадигмы", выйти за пределы, етц. Но это же не значит, что это хорошо.
Ну-ну.. Можно посмотреть на то, что за пределами "императивной парадигмы", выйти за пределы, етц. Но это же не значит, что это хорошо.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
- nameless noob
- Полковник
- Сообщения: 1682
- Зарегистрирован: 01.09.2010
- Откуда: Россия
- Благодарил (а): 21 раз
- Поблагодарили: 56 раз
- Контактная информация:
nikit-xxx
спасибо, но там всего одна строчка и где-то штук 10-15 чисел, в input.txt
спасибо, но там всего одна строчка и где-то штук 10-15 чисел, в input.txt
Последний раз редактировалось nameless noob 27.10.2012, 21:32, всего редактировалось 1 раз.
-
- Капитан
- Сообщения: 492
- Зарегистрирован: 23.05.2010
- Благодарил (а): 14 раз
- Поблагодарили: 43 раза
- Контактная информация:
NiGHt-LEshiY
Везде есть преимущества и недостатки.
Везде есть преимущества и недостатки.
- nikit-xxx
- Лейтенант
- Сообщения: 208
- Зарегистрирован: 28.11.2007
- Благодарил (а): 44 раза
- Поблагодарили: 5 раз
nameless noob
в коде, что я привёл выше, пары чисел-через-дробь не обязаны быть на разных строках[txtspoil]- ты бы это понял, если бы самостоятельно прочитал в книжках (Г. Шилдт) как работает scanf()[/txtspoil]
плохоочень мутно формулируешь задачу.
в коде, что я привёл выше, пары чисел-через-дробь не обязаны быть на разных строках[txtspoil]- ты бы это понял, если бы самостоятельно прочитал в книжках (Г. Шилдт) как работает scanf()[/txtspoil]
ну так перенаправь поток через freopen()[txtspoil], думаешь мне охота делать это за тебя?[/txtspoil]nameless noob писал(а):nikit-xxx
спасибо, но там всего одна строчка и где-то штук 10-15 чисел, в input.txt
чтобы тебя хорошо поняли, что конкретно ты хочешь от чисел-пробело-слэшей, какие их комбинации встретятся в файле, какие не встретятся, что надо делать если встретится неверная комбинация - надо описать поведение программы в таких ситуациях и привести примеры входных файлов. Если короче, тыnameless noob писал(а):где-то штук 10-15 чисел, в input.txt
Последний раз редактировалось nikit-xxx 27.10.2012, 22:37, всего редактировалось 4 раза.
