Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
#1

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

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

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

Результат ниже приведенного кода:
Код
[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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2015, 18:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Char*. Как определить размер строки? (C++):

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

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

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

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

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

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

39
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 18:28 #2
strlen
0
Prorok2323
168 / 126 / 74
Регистрация: 04.12.2013
Сообщений: 550
29.03.2015, 18:28 #3
C++
1
std::cout << strlen(ch);
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
29.03.2015, 18:55 #4
Цитата Сообщение от mibin Посмотреть сообщение
sizeof(ch)
ch - уазатель, sizeof(ch) возвращает размер указателя. Для 32х-битной платформы - это 4 байта.

Добавлено через 2 минуты
Цитата Сообщение от Prorok2323 Посмотреть сообщение
std::cout << strlen(ch);
Это тоже не размер строки, а количество символов строки без '\0', что нужно учитывать, когда под строку выделяется память (не забыть увеличить на единицу то, что выдаёт strlen()).
1
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
29.03.2015, 19:07  [ТС] #5
Согласен...я наверное привел не совсем корректный пример, хотел сократить .
Вот более полный и корректный пример.
Суть в том, что я загружаю в буфер 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
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2015, 19:10 #6
Цитата Сообщение от lss Посмотреть сообщение
Это тоже не размер строки, а количество символов строки без '\0',
Смотря в каком контексте использовать слово "размер".
Если для выделения памяти, то надо конечно учесть терминирующий ноль.
А если для кол-ва символов, то здесь и вовсе возможны варианты с кодировками.

Добавлено через 2 минуты
mibin, если не считать наличие cout, то твой код по сути сишный, а не плюсовый. И перед выполнением fread для буфера должна быть выделена память в нужном кол-ве.
0
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
29.03.2015, 19:14  [ТС] #7
Да, вот код где я выделил память для 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
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
29.03.2015, 19:16 #8
Цитата Сообщение от mibin Посмотреть сообщение
и пытаюсь понять его размер
Странное пишешь. Сначала определяешь размер файла, чтобы выделить буфер нужного размера, а потом что-то пытаешься понять.
C++
1
char* buf = new char[fsize];
Добавлено через 1 минуту
Через указатель, на динамически выделенную память, ты размер этой памяти не определишь.
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:17 #9
C
1
2
3
char* buf = (char *)malloc(fsize + 1);
fread(buf, sizeof(char), fsize, f);
buf[fsize] = '\0';
1
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
29.03.2015, 19:21  [ТС] #10
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки, и совершенно не важно откуда эта строка взялась, была ли загружа из файла или кто-то руками что-то написал.

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

Добавлено через 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;
}
Результат:
Код
File size = 79524
[PROC] Size of string = 4
[PROC_2] Size of string = 4
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
29.03.2015, 19:21 #11
Цитата Сообщение от mibin Посмотреть сообщение
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки, и совершенно не важно откуда эта строка взялась, была ли загружа из файла или кто-то руками что-то написал.
Как мы видели выше, если написать строку руками, то все верно получается, размер определился корректно, но стоило загрузить строку из файла, то размер буфера не может определится.
Если это одна строка, то читай её текстовыми методами (функциями), а не бинарными, тогда в конце строки будет '\0'.
0
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
29.03.2015, 19:23  [ТС] #12
Цитата Сообщение от lss Посмотреть сообщение
Через указатель, на динамически выделенную память, ты размер этой памяти не определишь.
Получается char* ch = "Это пример" это не динамически выделенная память?
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:23 #13
сдается мне что код не перекомпилен после изменений...
0
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
29.03.2015, 19:24  [ТС] #14
Цитата Сообщение от lss Посмотреть сообщение
Если это одна строка, то читай её текстовыми методами (функциями), а не бинарными, тогда в конце строки будет '\0'.
Это не одна строка, это может быть строка, а может быть файл с изображением или музыкой и т.д.

Добавлено через 47 секунд
Цитата Сообщение от retmas Посмотреть сообщение
сдается мне что код не перекомпилен после изменений...
Сделал Build all и результат тот же.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2015, 19:26 #15
mibin, strlen() возвращает размер сишной строки, а такая строка подразумевает наличие нулевого символа в конце ('\0'). Ты же читаешь файл с картинкой (судя по расширению jpg). Там этих нулей может быть воз и маленькая тележка, и судя по 4ке, которая у тебя выводится этот ноль как раз на 5ой позиции в файле.
Посмотри свой файл каким-нибудь hex-редактором и поищи нулевые байты, чтобы убедиться.
1
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
29.03.2015, 19:27 #16
Цитата Сообщение от mibin Посмотреть сообщение
Получается char* ch = "Это пример" это не динамически выделенная память?
Нет, это указтелю присваивается адрес строкового литерала, который находится в статической памяти.
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:29 #17
Цитата Сообщение от mibin Посмотреть сообщение
"D:\\10004.jpg"
понятненько... там же не строки как я понимаю и вызов strlen бессмыслен
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
29.03.2015, 19:31 #18
Цитата Сообщение от mibin Посмотреть сообщение
f = fopen("D:\\10004.jpg", "r");
И файл неправильно открываешь. Чтобы fseek(), ftell() правильно работали, нужно для бинарного чтения открывать: "rb".
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
29.03.2015, 19:32 #19
Цитата Сообщение от mibin Посмотреть сообщение
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки
не выйдет. придется передавать размер. т.к. по сути у тебя не строка, а массив байт
0
mibin
49 / 49 / 9
Регистрация: 21.10.2009
Сообщений: 272
29.03.2015, 19:33  [ТС] #20
Цитата Сообщение от lss Посмотреть сообщение
И файл неправильно открываешь. Чтобы fseek(), ftell() праильно работали, нужно для бинарного чтения открывать: "rb".
ftell верно определил размер файла.
0
29.03.2015, 19:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2015, 19:33
Привет! Вот еще темы с решениями:

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

Как скопировать содержимое строки char?
У меня в структуре есть член структуры char* text; и const temp char* =...

Как объединить три char строки одну?
Мне конечно говорили, что c++ не прост в постижение, но не настолько же... У...

Как соединить три строки char в одну?
Должно было получиться к примеру Документ 1.txt был открыт.Не вышло. char*...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru