Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232

Как проверить является ли тип переменной массивом символов?

17.02.2022, 22:23. Показов 4810. Ответов 41
Метки нет (Все метки)

C++
1
2
char ltr[]="symbols";
if(ltr=='тип char[]')cout << "ok";else cout << "no";// ok
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.02.2022, 22:23
Ответы с готовыми решениями:

Как проверить тип переменной?
::Как проверить тип переменой?

Как проверить, что тип T является типом Nullable<T1>?
Как проверить, что тип T является типом Nullable&lt;T1&gt;, где T1 неизвестный тип?

Проверить тип переменной
Здравствуйте. Имею 2 строки: a = 123 if a == int: print (&quot;OK&quot;) Я похоже совсем потерялся в этой жизни. Почему оно не выводит...

41
Заблокирован
18.02.2022, 09:01
Цитата Сообщение от Verevkin Посмотреть сообщение
Если надо сдампить строку, передавай указатель на начало её данных.
Я приводил пример выше. В мономорфном коде ты можешь сопоставлять типы вручную, в полиморфном - нет.

У тебя даже в цитате условие "если строка то ...".
0
2404 / 1934 / 763
Регистрация: 27.07.2012
Сообщений: 5,573
18.02.2022, 09:02
Цитата Сообщение от jqnut Посмотреть сообщение
std::string сдампит?
Цитата Сообщение от jqnut Посмотреть сообщение
Я имею ввиду, что значение строки таким образом не получить.
Так нужен дамп или значение строки?
0
Заблокирован
18.02.2022, 09:14
Цитата Сообщение от John Prick Посмотреть сообщение
Так нужен дамп или значение строки?
Вопрос вида "нужен снег или замерзшая вода?". Дамп это и есть значение. Точнее, его представление.
0
2404 / 1934 / 763
Регистрация: 27.07.2012
Сообщений: 5,573
18.02.2022, 09:22
Цитата Сообщение от jqnut Посмотреть сообщение
Дамп это и есть значение.
Ну если так самому себе термины придумывать, то да.
0
Заблокирован
18.02.2022, 09:33
Цитата Сообщение от John Prick Посмотреть сообщение
Ну если так самому себе термины придумывать, то да.
Ну вы можете опровергнуть мои слова, показав семантическое различие между дампом и значением. Если это действительно разные вещи, трудностей быть не должно.
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
18.02.2022, 09:39  [ТС]
В принципе дамп памяти в C++ не особо то и нужен, к тому же в некоторых IDE есть отладчики и возможность посмотреть и дамп памяти, но я не пользуюсь стандартными реализациями(std,stl и др.), пользуюсь простым редактором без возможности отладки(мне так удобнее) и при разных операциях с памятью при сдвиге в памяти, копировании и др. иногда наглядно хочется посмотреть что там в памяти творится. В частности делал вот свои функции работы с строкой, вырезку, замена вставка и др. Поэтому решил сделать функцию дампа.

Есть и простая функция которая просто выводит значение переменной или массива i::o(var,"комментарий");
Миниатюры
Как проверить является ли тип переменной массивом символов?  
0
2404 / 1934 / 763
Регистрация: 27.07.2012
Сообщений: 5,573
18.02.2022, 09:40
Цитата Сообщение от jqnut Посмотреть сообщение
Ну вы можете опровергнуть мои слова, показав семантическое различие между дампом и значением.
string может использовать, например, оптимизацию коротких строк. Что будет представлять для такой строки дамп? А что значение?
0
Заблокирован
18.02.2022, 09:51
Цитата Сообщение от John Prick Посмотреть сообщение
string может использовать, например, оптимизацию коротких строк. Что будет представлять для такой строки дамп? А что значение?
Вы ничего не ответили. Я просил вас показать различие двух понятий. И тут вы задаёте мне вопрос - "а что представляет собой понятие1 и что понятие2?". Вы спорите сами не понимая о чём? Иных причин ответа вопросом на вопрос я не вижу.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
18.02.2022, 10:35
Не поленился написать пример.
Думайте, что хотите, но я, как исполнитель, ВСЕГДА знаю, с данными какого типа работаю. Это необходимо.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <cstdio>
#include <cstdint>
#include <cstring>
#include <string>
 
#define C_MEM // если определён, юзать сишные функции памяти вместо операторов С++
 
using namespace std;
 
// строка НЕХ-дампа байтов куска памяти размером size
// начинающегося по адресу x
char* any2hexdump(void* x, size_t size)
{
  #ifdef C_MEM
  char* dump = (char*)calloc(1 + 3 * size, sizeof(char));
  #else
  char* dump = new char[1 + 3 * size];
  #endif
 
  if (!size)  return dump; // при нулевой длине
 
  // преобразования
  const char *HEXDIG = "0123456789ABCDEF";
  for (uint8_t *xptr = (uint8_t*)x, *dptr = (uint8_t*)dump; size--; xptr++)
  {
    *dptr++ = HEXDIG[*xptr >> 4];
    *dptr++ = HEXDIG[*xptr & 0x0F];
    *dptr++ = size ? 0x20 : 0x00;
  }
 
  return dump;
}
 
typedef struct
{
  void* addr;
  size_t size;
  const char* name;
}
TValue;
 
#define COUNTOF(st_arr) (sizeof(st_arr) / sizeof(st_arr[0]))
 
int main()
{
  short        a = 0x1234;
  int          b = 0x12345678;
  uint64_t     c = 0x123456789ABCDLL;
  char       d[] = "test c-string";
  string       e = "test c++ string";
  double       f = 0.125;
  long double  g = -0.125;
 
  #pragma pack(1) // <--- выравнивание влияет
  struct {int x = 1; double y = 2.0; short z = 0x1234;} h;
  #pragma pack()
 
  static const TValue values[] =
  {
    {&a, sizeof(a), "a"}, // 16 бит
    {&b, sizeof(b), "b"}, // 32 бита
    {&c, sizeof(c), "c"}, // 64 бит
    { d, sizeof(d), "d"}, // указатель *char
    {&e, sizeof(e), "e"}, // класс (структура)
    {(char*)e.data(), 1 + e.capacity(), "e.data"}, // данные внутри строки (с завершающим нулём)
    {&f, sizeof(f), "f"}, // 64 бит
    {&g, sizeof(g), "g"}, // 128 бит
    {&h, sizeof(h), "h"}  // структура (хз какой размер)
  };
 
  printf("$ sizeof(char) = %llu\n", sizeof(char));
 
  for (auto v : values)
  {
    char* dump = any2hexdump(v.addr, v.size);
    printf("# dump of '%s'[%llu]: %s\n", v.name, v.size, dump);
    #ifdef C_MEM
    free(dump);
    #else
    delete []dump;
    #endif
  }
 
  system("pause");
  return 0;
}
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
18.02.2022, 10:47  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
string может использовать, например, оптимизацию коротких строк. Что будет представлять для такой строки дамп? А что значение?
Кстати да. Я вот сделал свой класс для работы со строками. И объект строки у меня может быть как с фиксированным размером, так и с динамическим. В вложении на скрине переменная s1 имеет фиксированный размер 6, значение этой переменной можно изменять, но её размер будет не более 6 символов. Переменная s2 динамическая строка, у динамической строке можно указывать кратность(т.е. увеличение размера при изменении для уменьшения количества копирования).
STRING(19,32,32){динамическая строка} означает, что текущий размер 19, 32 вторая цифра это до какого размера может увеличится без копирования в памяти и третья 32 это кратность на какое количество будет увеличено если размер привысит 32 символа, то есть при размере 33, будет 33,64,32
Дамп соответственно будет уже на 64 символа.
Миниатюры
Как проверить является ли тип переменной массивом символов?  
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
18.02.2022, 11:10  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Видео (18+).
"Адекватность" так и прёт..
0
Заблокирован
18.02.2022, 11:37
Цитата Сообщение от Verevkin Посмотреть сообщение
Никак. А зачем?
Цитата Сообщение от Verevkin Посмотреть сообщение
я, как исполнитель, ВСЕГДА знаю, с данными какого типа работаю. Это необходимо.
Позорище. И так всегда, говорил нельзя узнать/не нужно, а оказалось всегда знаю и это необходимо.
2
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
18.02.2022, 12:22
jqnut,
нельзяузнать/не нужно потому что всегда знаю. Имеется ввиду походу.

Добавлено через 16 минут
Никак. А зачем?
Кстати, возникла ассоциация. Например шаблонная функция для сортировки. Которой надо узнать какой тип пришел чтоб применить одну и ту-же сортировку, но вот есть нюансы связанные с типом(например временная переменная).
С появлением decltype конечно полегче стало. Раньше что-то изобретали с sizeof-ом, передавали флаг типа в переменной и т.п. Ну и т.п..
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2022, 13:25
Цитата Сообщение от jqnut Посмотреть сообщение
Дамп это и есть значение. Точнее, его представление.
Думаю, что на самом деле имелось в виду не это.
Имелось в виду: "Так нужен дамп <объекта> или значение строки?"

И очевидно, что если по приведенному примеру с SSO, сделать дамп объекта std::string, то в него будет входить не только значение строки, но и служебные данные.
Если же сделать дамп объекта std::string, без SSO, то значения строки в нем не будет вовсе, зато будет значение указателя на эту строку, размер, capacity.
Возможно предполагается никогда не делать дампа объект std::string, а всегда делать только дамп строки по указателю на нее (и тогда нам потребуется выделить семейства типов, которые обрабатываются подобным образом).

Естественно как именно правильно, зависит от конкретных условий, но совсем уж утверждать, что данный вопрос не имеет смысла, думаю, нельзя.
1
Заблокирован
18.02.2022, 13:54
Цитата Сообщение от DrOffset Посмотреть сообщение
с SSO, сделать дамп объекта std::string, то в него будет входить не только значение строки, но и служебные данные
И это будет дамп данных + заголовков.
Цитата Сообщение от DrOffset Посмотреть сообщение
сделать дамп объекта std::string, без SSO, то значения строки в нем не будет вовсе, зато будет значение указателя на эту строку, размер, capacity.
А это дамп только заголовков. Т. е. имеем два разных дампа.

Я не знаю, почему это так сложно воспринимается. Дампится что - значение чего-либо. Всё. Здесь нет противопоставления "A или B", здесь одно следует из другого.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2022, 14:02
Цитата Сообщение от jqnut Посмотреть сообщение
Здесь нет противопоставления "A или B", здесь одно следует из другого.
Допустим мы написали вот такую функцию:
C++
1
2
3
4
template <typename T>
void dump(T const &var) {
     print_hex_dump(&var, sizeof(var));
}
Этого достаточно или нет? Ответ: зависит от того, что мы хотим. Этот код будет дампить только объект, который туда передан, но о его возможно сложном внутреннем представлении этот код ничего не знает. Если стоит задача определять некоторые такие объекты и делать дамп их сложной части дополнительно, то придется написать еще код:
C++
1
2
3
4
void dump(std::string const &var) {
     print_hex_dump(&var, sizeof(var));
     print_hex_dump(var.c_str(), var.size());
}
Так вот, судя по плюсу со стороны John Prick, он и спросил: "нужно ли делать перегрузку для специальной обработки std::string, или достаточно общей версии?"
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
18.02.2022, 14:05
Цитата Сообщение от YUEN HOIFEF Посмотреть сообщение
нельзяузнать/не нужно потому что всегда знаю. Имеется ввиду походу.
всё так.
0
Заблокирован
18.02.2022, 14:18
Цитата Сообщение от DrOffset Посмотреть сообщение
Этого достаточно или нет? Ответ: зависит от того, что мы хотим.
Без понятия, на что вы отвечаете, я это же и написал выше - два разных дампа. К тому же, если есть некая условность(в одном случае тип нужен, а в другом нет), утверждение про достаточность {ptr, size} в произвольном контексте уже неверен.
Цитата Сообщение от DrOffset Посмотреть сообщение
Так вот, судя по плюсу со стороны John Prick, он и спросил: "нужно ли делать перегрузку для специальной обработки std::string, или достаточно общей версии?"
Нет, он не мог этого спросить. Я с самого начала говорил, что перегрузка нужна(либо иной диспатч по типу). Это просто попытки оправдываться.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
18.02.2022, 15:27
Цитата Сообщение от jqnut Посмотреть сообщение
Я с самого начала говорил, что перегрузка нужна(либо иной диспатч по типу).
Вы зацепились за слово "значение", в то время как оно в изначальном вопросе вообще не играло роли. Не о разнице между "дампом и значением" шла речь, а о способе дампа. Вы сами вот выше сказали, что это два разных дампа. Дамп объекта строки (да, это тоже будет значение - с этим никто не спорит), и дамп значения строки - это два разных дампа. Об этом и был его вопрос. И этот вопрос закономерен, потому что ваша фраза "std::string сдампит?" может иметь несколько ответов в зависимости от того, что понимается под "сдампит": один вид дампа (только содержимое объекта), или второй (только значение по указателю), или два сразу.

Возможно автор поста как-то не очень понятно выразился, но я совершенно точно уверен, что имелось в виду именно это. И если ваша цель не просто тут поругаться с кем-то, а нормальный конструктивный диалог, то предлагаю прислушаться к тому, что я говорю.
3
Заблокирован
18.02.2022, 16:58
В общем, мне лениво спорить с человеком, который как бот раз за разом отвечает на что угодно, кроме того что ему пишут.
Цитата Сообщение от DrOffset Посмотреть сообщение
Об этом и был его вопрос.
Я уже отвечал на это. Разберу чуть подробнее. Можно пойти на предыдущую страницу и посмотреть, что я возражал на достаточность {ptr, size}, который сдампит только заголовки. После этого вопрос "так какой способ дампа нужен: всё или только заголовки?" не имеет смысла - очевидно, если я возражаю против достаточности дампа заголовков, ответ будет "всё".

Также можно обратить внимание на пост про "придумывать свои определения". Т. е. данный персонаж сразу же оперировал своими понятиями, и нигде не пытался уточнить, что я имею ввиду - очевидный сценарий при неоднозначности. Попытки представить данное явление как какое-то непонимание - манипуляции и забалтывание.
Цитата Сообщение от DrOffset Посмотреть сообщение
Возможно автор поста как-то не очень понятно выразился, но я совершенно точно уверен, что имелось в виду именно это. И если ваша цель не просто тут поругаться с кем-то, а нормальный конструктивный диалог, то предлагаю прислушаться к тому, что я говорю.
Эти заходы. Во первых, "я совершенно точно уверен". Доказывает ли это что-то, либо опровергает? Нет и нет.

Во вторых, по поводу "поругаться с кем-то". Ни вы, ни кто-либо другой не сможете показать мне этой ругани - ничего этого нет. Ну и заход "если вы не агрессор/еретик - придерживайтесь моего мнения" - это сильно, типичная секта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2022, 16:58

Надо проверить является ли значение переменной целым
10-10 = 1.7....E-15 ??? Please, posmotrite fragment coda. Nado proverit' javljajetsja li zna4enije peremnnoj celym ili net. Ne...

Разработайте пользовательский тип “Многочлен от одной переменной”. Многочлен задается степенью и массивом коэффициентов
Разработайте пользовательский тип “Многочлен от одной переменной”. Многочлен задается степенью и массивом коэффициентов. Для...

Проверить, является ли введенная последовательность символов симметричной
Проверить, является ли введенная последовательность символов симметричной трёмя способами: используя стек, очередь и дек. Помогите...

Рекурсия: проверить, является ли симметричной подпоследовательность символов
Добрый вечер..... У меня возникла проблема, с которой я столкнулся.... Мне нужно написать рекурсивную функцию по такой задачи: Задана...

Как определить тип переменной, ссылающейся на определённый класс? Нужен именно тип, а не ссылка на обьект!
interface HowDefineMyType { void info(); } class A implements HowDefineMyType { public int x;


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru