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

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

29.03.2015, 18:26. Показов 77180. Ответов 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
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 18:28
strlen
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
29.03.2015, 18:28
C++
1
std::cout << strlen(ch);
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 18:55
Цитата Сообщение от mibin Посмотреть сообщение
sizeof(ch)
ch - уазатель, sizeof(ch) возвращает размер указателя. Для 32х-битной платформы - это 4 байта.

Добавлено через 2 минуты
Цитата Сообщение от Prorok2323 Посмотреть сообщение
std::cout << strlen(ch);
Это тоже не размер строки, а количество символов строки без '\0', что нужно учитывать, когда под строку выделяется память (не забыть увеличить на единицу то, что выдаёт strlen()).
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 19:07  [ТС]
Согласен...я наверное привел не совсем корректный пример, хотел сократить .
Вот более полный и корректный пример.
Суть в том, что я загружаю в буфер char* файл и пытаюсь понять его размер.

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
#include <stdio.h>
#include <iostream.h>
 
void proc(char* ch) {
    cout << "[PROC] Size of string = "   << sizeof(ch) << endl;
    cout << "[PROC_2] Size of string = " << strlen(ch) << endl;
}
 
 
void main() {
 
    FILE *f;
    int fsize;
 
    f = fopen("D:\\10004.jpg", "r");
 
    fseek(f, 0, SEEK_END);
    fsize = ftell(f);
    rewind(f);
 
    cout << "Step 1" << endl;
    char* buf;
    cout << "Step 2" << endl;
    fread(buf, sizeof(char), fsize, f);
    cout << "Step 3" << endl;
    fclose(f);
 
    cout << "File size = " << fsize << endl;
    proc(buf);
 
    int i;
    cin >> i;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2015, 19:10
Цитата Сообщение от lss Посмотреть сообщение
Это тоже не размер строки, а количество символов строки без '\0',
Смотря в каком контексте использовать слово "размер".
Если для выделения памяти, то надо конечно учесть терминирующий ноль.
А если для кол-ва символов, то здесь и вовсе возможны варианты с кодировками.

Добавлено через 2 минуты
mibin, если не считать наличие cout, то твой код по сути сишный, а не плюсовый. И перед выполнением fread для буфера должна быть выделена память в нужном кол-ве.
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 19:14  [ТС]
Да, вот код где я выделил память для buffer.
Ошибка тут ушла, а вот результат итоговый все равно не верен.
Это тестовый пример, итоговый содержит в себе классы.

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
#include <stdio.h>
#include <iostream.h>
 
void proc(char* ch) {
    cout << "[PROC] Size of string = "   << sizeof(ch) << endl;
    cout << "[PROC_2] Size of string = " << strlen(ch) << endl;
}
 
 
void main() {
 
    FILE *f;
    int fsize;
 
    f = fopen("D:\\10004.jpg", "r");
 
    fseek(f, 0, SEEK_END);
    fsize = ftell(f);
    rewind(f);
 
    cout << "Step 1" << endl;
    char* buf = (char *)malloc(fsize);
    cout << "Step 2" << endl;
    fread(buf, sizeof(char), fsize, f);
    cout << "Step 3" << endl;
    fclose(f);
 
    cout << "File size = " << fsize << endl;
    proc(buf);
 
    int i;
    cin >> i;
}
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 19:16
Цитата Сообщение от mibin Посмотреть сообщение
и пытаюсь понять его размер
Странное пишешь. Сначала определяешь размер файла, чтобы выделить буфер нужного размера, а потом что-то пытаешься понять.
C++
1
char* buf = new char[fsize];
Добавлено через 1 минуту
Через указатель, на динамически выделенную память, ты размер этой памяти не определишь.
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:17
C
1
2
3
char* buf = (char *)malloc(fsize + 1);
fread(buf, sizeof(char), fsize, f);
buf[fsize] = '\0';
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 19:21  [ТС]
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки, и совершенно не важно откуда эта строка взялась, была ли загружа из файла или кто-то руками что-то написал.

Как мы видели выше, если написать строку руками, то все верно получается, размер определился корректно, но стоило загрузить строку из файла, то размер буфера не может определится.

Добавлено через 4 минуты
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
#include <stdio.h>
#include <iostream.h>
 
void proc(char* ch) {
    cout << "[PROC] Size of string = "   << sizeof(ch) << endl;
    cout << "[PROC_2] Size of string = " << strlen(ch) << endl;
}
 
 
void main() {
 
    FILE *f;
    int fsize;
 
    f = fopen("D:\\10004.jpg", "r");
 
    fseek(f, 0, SEEK_END);
    fsize = ftell(f);
    rewind(f);
 
    char* buf = (char *)malloc(fsize + 1);
    fread(buf, sizeof(char), fsize, f);
    buf[fsize] = '\0';
    fclose(f);
 
    cout << "File size = " << fsize << endl;
    proc(buf);
 
    int i;
    cin >> i;
}
Результат:
Code
1
2
3
File size = 79524
[PROC] Size of string = 4
[PROC_2] Size of string = 4
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 19:21
Цитата Сообщение от mibin Посмотреть сообщение
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки, и совершенно не важно откуда эта строка взялась, была ли загружа из файла или кто-то руками что-то написал.
Как мы видели выше, если написать строку руками, то все верно получается, размер определился корректно, но стоило загрузить строку из файла, то размер буфера не может определится.
Если это одна строка, то читай её текстовыми методами (функциями), а не бинарными, тогда в конце строки будет '\0'.
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 19:23  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Через указатель, на динамически выделенную память, ты размер этой памяти не определишь.
Получается char* ch = "Это пример" это не динамически выделенная память?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:23
сдается мне что код не перекомпилен после изменений...
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 19:24  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Если это одна строка, то читай её текстовыми методами (функциями), а не бинарными, тогда в конце строки будет '\0'.
Это не одна строка, это может быть строка, а может быть файл с изображением или музыкой и т.д.

Добавлено через 47 секунд
Цитата Сообщение от retmas Посмотреть сообщение
сдается мне что код не перекомпилен после изменений...
Сделал Build all и результат тот же.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2015, 19:26
mibin, strlen() возвращает размер сишной строки, а такая строка подразумевает наличие нулевого символа в конце ('\0'). Ты же читаешь файл с картинкой (судя по расширению jpg). Там этих нулей может быть воз и маленькая тележка, и судя по 4ке, которая у тебя выводится этот ноль как раз на 5ой позиции в файле.
Посмотри свой файл каким-нибудь hex-редактором и поищи нулевые байты, чтобы убедиться.
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 19:27
Цитата Сообщение от mibin Посмотреть сообщение
Получается char* ch = "Это пример" это не динамически выделенная память?
Нет, это указтелю присваивается адрес строкового литерала, который находится в статической памяти.
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:29
Цитата Сообщение от mibin Посмотреть сообщение
"D:\\10004.jpg"
понятненько... там же не строки как я понимаю и вызов strlen бессмыслен
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.03.2015, 19:31
Цитата Сообщение от mibin Посмотреть сообщение
f = fopen("D:\\10004.jpg", "r");
И файл неправильно открываешь. Чтобы fseek(), ftell() правильно работали, нужно для бинарного чтения открывать: "rb".
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:32
Цитата Сообщение от mibin Посмотреть сообщение
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки
не выйдет. придется передавать размер. т.к. по сути у тебя не строка, а массив байт
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
29.03.2015, 19:33  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
И файл неправильно открываешь. Чтобы fseek(), ftell() праильно работали, нужно для бинарного чтения открывать: "rb".
ftell верно определил размер файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2015, 19:33
Помогаю со студенческими работами здесь

Строки: почему компилятор пишет , что переменная типа 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 положить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru