Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Хочу научиться прораммировать на С++  (Прочитано 11063 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: Хочу научиться прораммировать на С++
« Ответ #30 : 04 Мая 2009, 15:31:59 »
2 Sova777: UTF-8 есть кодировка с переменной длиной символа! Так что твои 2 байта это пальцем в небо... повезло что угадал. =)
Моё высказывание значило только то, что там было написано. "А там русскии буквы - 2 байта." Перефразирую: буквы современного русского алфавита занимают 2 байта в UTF8 кодировке.
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн lexpartizan

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #31 : 05 Мая 2009, 13:15:11 »
Всем большое спасибо!

Оффлайн yaromir

  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #32 : 05 Мая 2009, 13:59:11 »
Народ, что означает t в wchar_t, size_t и пр.?

Оффлайн lexpartizan

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #33 : 05 Мая 2009, 18:22:46 »
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <stdlib.h>
using namespace std;

int main()
{
    setlocale(LC_ALL, getenv("LANG"));
    char a[]="123";
   // printf("%s",a);
    wchar_t s[] = L"русский";
    wprintf(L"%ls\n", s);
    printf("%s",a);
    return 0;
}
Интересное кино выходит. При закомментаренной строке работает команда wprintf(на экран выводится "русский"),  printf("%s",a); игнорируется. Если её раскомментить, то выводится 123123, а  wprintf(L"%ls\n", s); игнорируется. Чего-то я уже того :idiot2:. Если можно ещё примерчик работы с вводом-выводом "широкого текста" в файл. Ну и пример с вводом таких символов с клавиатуры.

ЗЫ. Программил в пределах школьного курса под досом(там проблем с кодировками не было, ascii решал.). Думал сейчас вспомнить кой-чего, а тут ,блин, даже текст осилить не могу.

Оффлайн yaromir

  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #34 : 06 Мая 2009, 01:35:49 »
Рискну предположить.
printf() и wprintf() не дружат. Не берусь утверждать, но возможно wprintf() - это перегрузка printf(), т.е. какой вариант встретился первым, тот и используется. При закомментированном printf() первым встречается вызов wprintf(), поэтому printf() игнорируется. А если раскомментировать printf(), то, т.к. вызов printf() был первым, то wprintf() игнорируется.
Уважаемые Гуру, а есть где-нибудь описание широких символов и функций работы с ними? В справочнике Шилдта я не нашел упоминания о широких символах.

Оффлайн Surzh

  • Участник
  • *
  • Сообщений: 153
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #35 : 06 Мая 2009, 01:54:21 »
Уважаемые Гуру, а есть где-нибудь описание широких символов и функций работы с ними? В справочнике Шилдта я не нашел упоминания о широких символах.

Насколько мне известно (могу ошибаться), широкие символы не являются частью стандарта С++, посему мало где описаны. Обычно, если есть их поддержка в той или иной библиотеке, то в названии функции просто надо добавить в начало или конец w. Больше ничего сказать не могу.
return 0;

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #36 : 06 Мая 2009, 02:06:09 »
Автору:

откуда такая проблема я не знаю, но могу предложить альтернативный вариант
#include "iostream"
using namespace std;

int main()
{
cout << "Привет" << endl;
return 0;
}
rosik@Rosik-HDM:~/test$ g++ 1.cpp -o exe && ./exe
Привет
PS это уже c++

To Oldwise:
http://www.opennet.ru/man.shtml?topic=wprintf&category=3&russian=2
вот тут есть чуть чуть, и далее по ссылкам. Извините, сам не сильно углублялся

PPS и еще мое имхо автору - подобные вопросы лучше задавать на сишных форумах. Здесь конечно помогут, но шанс найти человека, знающего такие мелкие детали, все же ниже.

Оффлайн Surzh

  • Участник
  • *
  • Сообщений: 153
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #37 : 06 Мая 2009, 02:13:31 »
PPS и еще мое имхо автору - подобные вопросы лучше задавать на сишных форумах. Здесь конечно помогут, но шанс найти человека, знающего такие мелкие детали, все же ниже.
Можешь что-то порекомендовать? Желательно не Windows-like
return 0;

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #38 : 06 Мая 2009, 05:39:28 »
Rosik, это вывод строки уже закодированной в UTF-8 на UTF-8 терминал... это все игрушки. смени локаль поменяй кодировку символов в терминале и твой пример поломается. также как ломаются все неюникодные программы
(Нажмите, чтобы показать/скрыть)

должно быть что-то типа
#include <iostream>
#include <cstdlib>
#include <locale>

int main() {
    std::locale loc(getenv("LANG"));
    std::locale::global(loc);
    std::wcout << L"Привет, мир!" << std::endl;
    return EXIT_SUCCESS;
}

Оффлайн oksyd

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #39 : 22 Мая 2009, 15:14:28 »
Не посчитайте за рекламу или флуд/спам/флейм, но есть jabber-конференция где вам помогут. Если вы, действительно, хотите научиться программировать на С++, то вам сюда.
(Нажмите, чтобы показать/скрыть)

Оффлайн yaromir

  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #40 : 22 Мая 2009, 21:56:10 »
Еще есть форум на http://www.cplusplus.com/ . Там отдельные разделы и по Linux, и по винде. И еще справочник по стандартной библиотеке.

Оффлайн Pk-13

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
    • Моя страница в контакте:
Re: Хочу научиться прораммировать на С++
« Ответ #41 : 23 Мая 2009, 15:44:30 »
Ставь geany и не забудь компилятор g++. Там и русский хорошо идёт, и кроме iostream библиотеки типа stdafx.h или conio.h не нужны, очень удобно. Но, привыкай тогда пользоваться cin и cout, т.к. printf, scanf и gets уже не пойдут)
« Последнее редактирование: 23 Мая 2009, 15:46:14 от Pk-13 »
хой! Мы, анархисты, народ не злой!

Оффлайн yaromir

  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #42 : 23 Мая 2009, 22:18:20 »
Ставь geany и не забудь компилятор g++. Там и русский хорошо идёт, и кроме iostream библиотеки типа stdafx.h или conio.h не нужны, очень удобно. Но, привыкай тогда пользоваться cin и cout, т.к. printf, scanf и gets уже не пойдут)
O_O . О, Господи.
Мешать Си и Си++ - быдло-подход в последней стадии. printf(), scanf(), gets() - это Си функции. Хотя в Си++ их и можно использовать, но уж если взялся писать на C++, то используй cin и cout.
А про заголовки просто убило:
Цитировать
и кроме iostream библиотеки типа stdafx.h или conio.h не нужны, очень удобно.
Вот до чего доводит богомерзкая visual studio.
Стандартная библиотека идет вместе с компиллятором. Вместе с gcc - библиотека Си, с g++ - библиотека C++. И не важно, какой IDE в качестве надстройки - хоть Geany, хоть Netbeans, хоть Eclipse, хоть что угодно.
Далее: conio.h и stdafx.h - это не стандартная библиотека.
Ну да, очень удобно, что в Linuxе нет:
- conio.h - заголовка MS-DOS для создания псевдографического интерфейса. Откуда ему там взяться?
- stdafx.h - заголовок, отвечающий за прекомпиллированные заголовки бинарников в windows. Откуда?
А printf(), scanf(), gets(), хоть и Си функции, но так же есть и, как раз, в iostream - заголовке, отвечающим за ввод-вывод в Си++. Сделано для совместимости с Си. И еще. gets() лучше не использовать - не проверяет на переполнение массива char, в который считывает. Может Гуру предложат лучшую альтернативу, но я сделал посимвольное считывание, которое записывает в массив из n char'ов n-1 символов из потока ввода, последним символом вставляя нуль-терминатор:
на Си
#include <memory.h>
#include <stdio.h>

int main(void)
{
    char buffer[8];
    int index;
    memset(buffer, 0, 8);
    for (index=0, buffer[index]=getchar()  ;
         (buffer[index]!='\n') && (index<7);
         ++index, buffer[index]=getchar()  )
        ;
    buffer[7]='\0';
    for (index=0; index<8; index++)
        printf("%i ", buffer[index]);
    printf("\n");
    return 0;
}
на Си++
#include <iostream>
#include <memory.h>

using namespace std;

int main()
{
    char buffer[8];
    int index;
    memset(buffer, 0, 8);
    for (index=0, buffer[index]=cin.get()  ;
         (buffer[index]!='\n') && (index<7);
         ++index, buffer[index]=cin.get()  )
        ;
    buffer[7]='\0';
    for (index=0; index<8; index++)
        cout << buffer[index] << ' ';
    cout << endl;
    return 0;
}
« Последнее редактирование: 23 Мая 2009, 22:43:42 от Oldwise »

Оффлайн Alexey-S

  • Активист
  • *
  • Сообщений: 296
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #43 : 23 Мая 2009, 23:45:08 »
И еще. gets() лучше не использовать - не проверяет на переполнение массива char, в который считывает. Может Гуру предложат лучшую альтернативу, но я сделал посимвольное считывание, которое записывает в массив из n char'ов n-1 символов из потока ввода, последним символом вставляя нуль-терминатор:
на Си
Пользуйтесь функцией fngets

Оффлайн yaromir

  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Re: Хочу научиться прораммировать на С++
« Ответ #44 : 24 Мая 2009, 15:00:39 »
Спасибо. Можно где-нибудь найти её описание? Что-то и Google молчит по этому поводу.  :-\

 

Страница сгенерирована за 4.43 секунд. Запросов: 25.