Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/391: Рейтинг темы: голосов - 391, средняя оценка - 4.71
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429

Char*. Как определить размер строки?

29.03.2015, 18:26. Показов 78218. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Вопрос вроде бы на первый взгляд простой, но ответ на него найти не получается.
Как определить разме строки?

Результат ниже приведенного кода:
Code
1
2
[MAIN] Size of string = 4
[PROC] Size of string = 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <iostream.h>
 
void proc(char* ch) {
  cout << "[PROC] Size of string = " << sizeof(ch) << endl;
}
 
void main() {
  char* ch = "Hello my dear world!";
 
  cout << "[MAIN] Size of string = " << sizeof(ch) << endl;
  proc(ch);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2015, 18:26
Ответы с готовыми решениями:

Найти размер динамической строки char
char *text = new char; *text='\0'; cout&lt;&lt; _msize(text); можно ли узнать размер строки используя sizeof вместо _msize?

Как определить размер строки LPTSTR?
Как определить размер строки LPTSTR? strlen не подходит...

Различное поведение функции которая копирует строки с char* t и char t[]
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

39
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 19:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от retmas Посмотреть сообщение
не выйдет. придется передавать размер
Со строкой-то, как раз, можно это сделать, только ТС пытается это сделать не со строкой.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:35
о том и речь
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 19:53
Цитата Сообщение от mibin Посмотреть сообщение
ftell верно определил размер файла
В одном случае будет верно, в другом неверно. В текстовом и бинарном режиме по разному обрабатывается символ новой строки.

Добавлено через 16 минут
Если в файле присутствуете байт со значением 26, то, при открытии для чтения в текстовом режиме, он будет обработан, как конец файла (eof() выдаст true), вне зависимости от методов чтения.
При открытии в бинарном режиме, этого не произойдёт, вне зависимости от методов чтения.
У тебя же файл не текстовый, поэтому там может и такое быть. Учитывай.
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 20:25  [ТС]
LSS я согласен я столкнулся с ситуацей когда чтение было не верное при установке флага "r".

А теперь смешное:
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
void proc(char* ch) {
    cout << "[PROC_2] Size of string = " << strlen(ch) << endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    FILE *f;
    int fsize = 0;
 
    f = fopen("D:\\probar.png", "rb");
 
    fseek(f, 0, SEEK_END);
    fsize = ftell(f);
    rewind(f);
 
    char* buf = new char[fsize + 1];
 
    int nr = fread(&buf, sizeof(char), fsize, f);
 
    buf[fsize] = '\0';
    cout << "Read number = " << nr << endl;
 
    fclose(f);
 
    cout << "File size = " << fsize << endl;
    proc(buf);
 
    int i;
    cin >> i;
 
    return 0;
}
Вот этот код верно определяет размер буфера в Visual C++ и не верно в Embarcadero C++
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 20:42
Цитата Сообщение от mibin Посмотреть сообщение
Вот этот код верно определяет размер буфера в Visual C++
Об этом уже написали. Дело случая, получается, что байт, со значением 0, только в конце буфера.
Идея не ясна. Зачем всё это, если в начале определяется размер данных в файле?
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 21:20  [ТС]
Основное недоумение вызывает почему Visual Studio и Embarcadero работает по разному.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 21:33
Embarcadero не знаю. На какой ОС работает? Windows?
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 21:37  [ТС]
Да на Windows 8.1. Embarcadero это бывший Borland
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 21:43
Пробуешь код из 24 поста? И какой результат (конкретно) в студии и в Embarcadero? Файл можешь выложить, с которым пробуешь?

Добавлено через 2 минуты
Цитата Сообщение от mibin Посмотреть сообщение
int nr = fread(&buf, sizeof(char), fsize, f);
Взятие адреса у buf - это лишнее, buf и так адрес (указатель).
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 21:46  [ТС]
Код именно с 24 поста.
File1 - это Embarcadero C++
ConsoleApplication3.cpp - VisualStudio C++
Вложения
Тип файла: 7z CPP.7z (776 байт, 3 просмотров)
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 21:48  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Взятие адреса у buf - это лишнее, buf и так адрес (указатель).
Точно...я лоханулся тут меняя все
Хотя результат забавный получился
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 21:56
Цитата Сообщение от mibin Посмотреть сообщение
File1 - это Embarcadero C++
ConsoleApplication3.cpp - VisualStudio C++
Я про этот файл спрашивал (выложить): "probar.png".
Вот на это не ответил:
Цитата Сообщение от lss Посмотреть сообщение
какой результат (конкретно) в студии и в Embarcadero?
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 22:03  [ТС]
А, все понял, картинку, а подумал файл исходников
Без проблем, могу.

Но мне кажется тут и так все понятно.
Массив buf был определен мною, я передал в fread фигню а не ссылку на массив...fread ничего с этим не смог сделать и вернул 0 - как кол-во прочитанный байт.
Далее я уже оперировал зануленым массивом buf, который был заполнен фигней выделенной ему из кучи...правда почему вот среды это по разному обработали...
Миниатюры
Char*. Как определить размер строки?  
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 22:06  [ТС]
Вот результат embarcadero.
Единственное что приходит на ум, так это то что у Emvarcadero свой менеджер памяти...поэтому такая разная реакция.
Миниатюры
Char*. Как определить размер строки?  
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 22:47
Цитата Сообщение от mibin Посмотреть сообщение
Но мне кажется тут и так все понятно.
Всё понятно, кроме: почему ftell(), в embarcadero, выдал 127821?
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 22:49  [ТС]
Потому что я перевел каретку в конец файла, который открыл, а ftell вернул разницу между первым и последним байтом, как я понимаю.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 22:56
Цитата Сообщение от mibin Посмотреть сообщение
Потому что я перевел каретку в конец файла, который открыл, а ftell вернул разницу между первым и последним байтом, как я понимаю.
В файле 65925 байтов, что ftell() и должен выдать (в студии это и выдаёт). Проверь файл на открытие (в в embarcadero), выведи значение f, после открытия файла.
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 23:04  [ТС]
Хм...его форум пережал что ли...я сейчас архив выложу...я свойствами файл смотрю и там показывается 127821.
Вложения
Тип файла: 7z probar.7z (111.8 Кб, 4 просмотров)
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 23:07
Цитата Сообщение от mibin Посмотреть сообщение
Хм...его форум пережал что ли...
Наверное. Тогда вопросов нет.

Добавлено через 2 минуты
Цитата Сообщение от mibin Посмотреть сообщение
Вот результат embarcadero.
Единственное что приходит на ум, так это то что у Emvarcadero свой менеджер памяти...поэтому такая разная реакция.
Бывает (от компилятора завист), что неинициализированная память заполняется нолями, поэтому, в Emvarcadero, strlen() сразу на 0 наткнулась, а в студии только в конце буфера.
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 23:14  [ТС]
Ну это логично по крайней мере
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2015, 23:14

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

Преобразование char в char* или разделить на две строки
Пытаюсь сделать программу под linux. Возникла проблема, описанная в заголовке. Мне нужно разделить строку в char на две по символу ? либо...

Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару примеров Буду весьма признательна

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

Как скопировать содержимое строки char?
У меня в структуре есть член структуры char* text; и const temp char* = CharToDouble(10) Что-то у меня не получается через strcat положить...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru