Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2015, 18:06   #1
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию char*. Как определить размер строки?

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

Результат ниже приведенного кода:

Код:
[MAIN] Size of string = 4
[PROC] Size of string = 4
Код:
#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);
}
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 18:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
void proc(char* ch) {
  cout << "[PROC] Size of string = " << strlen(ch) << endl;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2015, 19:04   #3
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Хорошо, согласен, тогда усложняю задачу

Код:
#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;
}
На strlen вылетает ошибка AccessViolation.
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 19:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Не удивительно )
Я вообще удивлен что программа дошла до вызова функции, а не вылетела раньше.
Ты массив buf описать - описал, а память под него не выделил. Вот и лезет AV.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2015, 19:11   #5
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Да, но это не решает задачи, размер буфера не определился все рвно.
Но ошибка ушла

Код:
#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;
}
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 19:26   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

JPG файл не есть строка.
Зачем определять длину строки, если у нас есть размер файла? Передавайте размер как второй аргумент - proc(char* buf, int len);
waleri вне форума Ответить с цитированием
Старый 29.03.2015, 19:37   #7
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
JPG файл не есть строка.
Зачем определять длину строки, если у нас есть размер файла? Передавайте размер как второй аргумент - proc(char* buf, int len);
Хотелось сделать процедуру, которая определит размер буфера.
Причем передаваться в процедуру может любая строка, будь то загруженная из файла или введенная руками
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 19:38   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Во-первых, разобраться с представлением строк, почитать про нуль-терминатор. Во-вторых, учесть то, что fread не добавляет нуль-терминатор в конец прочитанного.
220Volt вне форума Ответить с цитированием
Старый 29.03.2015, 19:41   #9
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Во-первых, разобраться с представлением строк, почитать про нуль-терминатор. Во-вторых, учесть то, что fread не добавляет нуль-терминатор в конец прочитанного.
Хорошо, я изменил часть кода:
Код:
	char* buf = (char *)malloc(fsize + 1);
	fread(buf, sizeof(char), fsize, f);
	buf[fsize] = '\0';
Но приэтом результат остался тем же.

Код:
File size = 79524
[PROC] Size of string = 4
[PROC_2] Size of string = 4
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 19:45   #10
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Цитата:
Сообщение от mibin Посмотреть сообщение
Хорошо, я изменил часть кода:
Код:
	char* buf = (char *)malloc(fsize + 1);
	fread(buf, sizeof(char), fsize, f);
	buf[fsize] = '\0';
Но приэтом результат остался тем же.

Код:
File size = 79524
[PROC] Size of string = 4
[PROC_2] Size of string = 4
Вы читаете не текст, откуда знаете что внутри прочитанного не используется '\0' ? Для оценки размера, fread возвращает количество прочитанных элементов.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить размер физического диска? Robin_ Общие вопросы Delphi 7 18.01.2016 07:11
Как определить размер видеостраницы axeforever12009 Помощь студентам 2 18.06.2013 17:01
Как определить размер структуры stpdqstns Общие вопросы C/C++ 10 30.01.2013 19:02
неопределённый размер строки типа char _KUL Общие вопросы C/C++ 4 16.05.2012 19:54
Как в Delphi определить размер файла? Nomad Помощь студентам 7 10.08.2010 08:33