С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/56: Рейтинг темы: голосов - 56, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
1

Что значит char c[10]

16.11.2012, 02:40. Показов 10965. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
объясните пожалуйста пошагово этот код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main( )
{
   char c[10], c2;
 
   cout << "Type 'abc': ";
   c2 = cin.get( );
   cin.unget( );
   cin.getline( &c[0], 9 );
   cout << c << endl;
}
хочу понять, что значит char c[10] это создание массива из 10 символов?
что делает функция get и unget, и getline... что это за параметры, &c[0] передается по ссылке... а нельзя просто передать, зачем по ссылке передавать? и что девять означает. эх, вот начинаю C++ изучать. конечно непривычно весьма.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2012, 02:40
Ответы с готовыми решениями:

что значит static char?
подскажите что означает static char ret;

Что значит две звездочки у char?
int main(int argc, char** argv)

Что значит запись char massiv[] = "text" ?
Почему не указан размер массива и присваивается строка?

Строки: почему компилятор пишет , что переменная типа char несовместима с const char?
char pass; int password( int d) { int m; char p; cout &lt;&lt; &quot;Введите пароль для доступа к...

30
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 11
16.11.2012, 02:46 2
Может тебе поможет, неплохая статья для совсем начинающих, по си++
http://www.programmersclub.ru/main/

К слову вот статья именно про функции, что ты спрашиваешь http://programmersclub.ru/33/
А &c[0] - это адрес начала строки(читай массива)
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
16.11.2012, 02:50 3
Цитата Сообщение от Lintu Посмотреть сообщение
Может тебе поможет, неплохая статья для совсем начинающих, по си++
http://www.programmersclub.ru/main/
Дружище, ты хоть одно слово unget во всех разделах статьи там видел? ТС не про вывод HelloWorld нас спрашивает, а спрашивает именно про этот метод.

Если уж кидать ссылку, то вот http://www.cplusplus.com/refer... eam/unget/

unget возвращает последний символ, прочитанный из cin назад в поток cin
В результате следующий за ним getline прочитает строку, включая этот символ.
Иначе в c[10] оказалась бы введённая строка без первой буквы
2
Заблокирован
16.11.2012, 03:58 4
Kuzia domovenok, это извращенный отлов экзепшнов. Такое только во сне может присниться.
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
17.11.2012, 00:45  [ТС] 5
вчера устал видимо, гуглил я unget, но вот сейчас решил подробнее разобрать пример который там:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// istream::unget example
#include <iostream>
using namespace std;
 
int main () {
  char c;
  int n;
  char str[256];
 
  cout << "Enter a number or a word: ";
  c = cin.get();
 
  if ( (c >= '0') && (c <= '9') )
  {
    cin.unget();
    cin >> n;
    cout << "You have entered number " << n << endl;
  }
  else
  {
    cin.unget();
    cin >> str;
    cout << " You have entered word " << str << endl;
  }
 
  return 0;
}
получается сначала мы читаем первый символ

c = cin.get();

если это цифра то значит юзер ввел цифру

кстати, а ведь если ввести "1ывдаоывдаоыва" то программа посчитает что ввели мы число. как посоветуете нормально реализовать?

unget значит просто возвращает символ обратно в поток ввода, чтобы заново его считать. с этим разобрался, спасибо.

Только вот насчет строки cin.getline( &c[0], 9 ); здесь девять - это максимальное кол-во символов? странно, разные описания функции getline http://ru.cppreference.com/w/c... ng/getline http://ru.cppreference.com/w/cpp/io/getline функции видимо разные. но вот не понятно почему передается &c[0] по ссылке... а еще интересно в конце массив выводится, никаких циклов для того чтобы собрать массив, просто "с" указано и все
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 5
17.11.2012, 00:57 6
time123
)) Судя по всему, вы переходите на С++ с паскаля или делфи)
Я так же новичок в С++ и мыслю точно так же, как и вы)
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
17.11.2012, 01:05 7
Цитата Сообщение от time123 Посмотреть сообщение
функции видимо разные.
Вы правы, это разные функции.
Цитата Сообщение от time123 Посмотреть сообщение
здесь девять - это максимальное кол-во символов?
Это сколько символов считать из cin.
Цитата Сообщение от time123 Посмотреть сообщение
передается &c[0] по ссылке...
Передается не по ссылке, а передается адрес первого элемента массива.
Цитата Сообщение от time123 Посмотреть сообщение
никаких циклов для того чтобы собрать массив, просто "с" указано и все
имя массива (c) является указателем на первый элемент массива, поэтому будут выведены все символы от c[0], до завершающего символа '\0'. Если его не окажется в Вашем массиве, то будет прочитана память дальше массива.
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
17.11.2012, 01:20  [ТС] 8
еще с указателями разбираюсь, вот к примеру код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int *a = new int; // Объявление указателя для переменной типа int
    int *b = new int(5); // Инициализация указателя
 
    *a = 10;
    *b = *a + *b;
 
     cout << "b is " << *b << endl;
 
    delete b;
    delete a;
 
    return 0;
}
при таком раскладе зачем вообще объявлять к примеру просто int a = 5; если можно с указателями сразу жонглировать
получается если указать & перед названием переменной или массивом, то получаешь адрес? еще такой вопрос, а если просто указать в данном примере cout << "b is " << b << endl; то получу адрес указателя, или нет? и если указать &b что это за адрес...

p.s. cvetik13, а вы, судя по нику, девушка?)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.11.2012, 01:22 9
time123, Получите. В данном примере. А если char* попробуете вывести - нужно будет в void* привести, чтобы увидеть адрес.
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
17.11.2012, 01:27  [ТС] 10
эм... что? зачем в void переводить? речь ведь идет об указателе на переменную типа char, или нет?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.11.2012, 01:34 11
time123, Да. По той простой причине, что для указателя на char перегружен оператор вывода в поток.
http://ideone.com/7oAABQ
http://ideone.com/I7XZMz

Во втором примере, вместо того что мы хотели выведет бред в первом выводе, т.к. указатель на char не терминирован нулем, потому вывод будет кривой.

http://ideone.com/BLTjef

В данном случае нулем терминирован, но строка пустая.
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
17.11.2012, 01:38 12
Цитата Сообщение от time123 Посмотреть сообщение
при таком раскладе зачем вообще объявлять к примеру просто int a = 5; если можно с указателями сразу жонглировать
А Вы умеете жонглировать сотней мячей? =)
Цитата Сообщение от time123 Посмотреть сообщение
получается если указать & перед названием переменной или массивом, то получаешь адрес?
Да. Это операция взятия адреса.
Цитата Сообщение от time123 Посмотреть сообщение
и если указать &b что это за адрес...
Указатель же тоже храниться в памяти. Так что это будет адрес указателя =)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.11.2012, 01:39 13
Croessmah, Кстати, не факт, что это оператор взятия адреса.) И чтобы не влететь в ситуацию, когда это не оператор взятия адреса иногда лучше юзать std::addressof/boost::addressof
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
17.11.2012, 01:41 14
Цитата Сообщение от ForEveR Посмотреть сообщение
Croessmah, Кстати, не факт, что это оператор взятия адреса.) И чтобы не влететь в ситуацию, когда это не оператор взятия адреса иногда лучше юзать std::addressof/boost::addressof
ну это да. Но, думаю, новичку не надо с этим зацикливаться =) ибо он уйдет в такие дебри, откуда потом не выбериться
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.11.2012, 01:42 15
Croessmah, Соглашусь. Просто уточнил.
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
17.11.2012, 03:23  [ТС] 16
так, значит в первом случае получаем адрес указателя, а во втором адрес переменной типа char

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    char c = 'a';
    char* pc = &c;
    std::cout << &pc << std::endl;
    std::cout << static_cast<void*>(pc) << std::endl;
}
а здесь вот http://ideone.com/7oAABQ не понятно почему это они вдруг в char сразу 4 символа поместили

в тип void приводится сам указатель, так? тогда а можно его с самого начала объявить как void, если тип char, или это будет неправильно? и еще интересует, на какие именно операции перегружен оператор для char-указателя? любопытно то что здесь http://ideone.com/BLTjef выдается пустая строка... с чего бы это, ну сам символ NULL там походу хранится.
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
17.11.2012, 03:34 17
Цитата Сообщение от time123 Посмотреть сообщение
выдается пустая строка... с чего бы это, ну сам символ NULL там походу хранится.
Вообще то принято, чтобы строка заканчивалась символом '\0', поэтому у Вас пустая строка.
попробуйте вот этот код:
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    char* pc = "MyString\0Hello World";
    std::cout << pc << std::endl;
}
Цитата Сообщение от time123 Посмотреть сообщение
тогда а можно его с самого начала объявить как void, если тип char, или это будет неправильно?
Указатель void, это указатель на какой-то кусок памяти.
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
17.11.2012, 03:40  [ТС] 18
тоесть указатель на указатель? или указатель на какой-то диапазон адресов памяти?

Мне бы еще разобраться с передачей значений в функцию, вот например часть кода

string mumble( int *array, int size )

что если передать int array
вообще вот если не ошибаюсь то можно передавать в функции переменные, массивы со знаками & *
если передать без знака то передается просто значение переменной (не по ссылке), если указать знак & то передается адрес ячейки памяти, а если указать со знаком * то передается значение по данному указателю, верно? то есть в этом примере array - это походу указатель на начало массива видимо, или нет... вот кусок этого кода

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <sstream>
string program_name( "our_program" );
string version( 0.01 );
// ...
 
string mumble( int *array, int size )
{
   if ( ! array ) {
      ostringstream out_message;
 
      out_message << "ошибка: "
                  << program_name << "--" << version
                  << ": " << __FILE__ << ": " << __LINE__
                  << " -- указатель равен 0; "
                  << " а должен адресовать массив.\n";
 
      // возвращаем строку, в которой находится сообщение
      return out_message.str();
   }
   // ...
}
насчет "MyString\0Hello World" ну я в курсе что это символ конца строки, таким образом в том примере это пустая строка получается
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
17.11.2012, 04:00 19
Цитата Сообщение от time123 Посмотреть сообщение
тоесть указатель на указатель? или указатель на какой-то диапазон адресов памяти?
Указатель на ЧТО-ТО.

Пример:
http://ideone.com/Hawfby
Цитата Сообщение от time123 Посмотреть сообщение
то есть в этом примере array - это походу указатель на начало массива видимо
судя по тексту ошибки - да. Но может быть и указатель на переменную типа int, собственно массив из одного элемента
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 5
18.11.2012, 18:18 20
Цитата Сообщение от time123 Посмотреть сообщение

p.s. cvetik13, а вы, судя по нику, девушка?)
Логично, что девушка. Ето что-то меняет?
0
18.11.2012, 18:18
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2012, 18:18
Помогаю со студенческими работами здесь

Что означает такая запись char *smt=new char[1]?
что означает такая запись char *smt=new char?

Sleep(8000) - что значит? На что можно заменить в борланд с++?
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не используется. Как...

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том...

Что значит ^= ?
нашел в коде данную фичу (язык С) не понимаю что конкретно она выполняет пример из кода ... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru