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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 01:03   #1
kuy
Форумчанин
 
Аватар для kuy
 
Регистрация: 05.09.2011
Сообщений: 109
По умолчанию Розмер строки

Здравствуйте. Столкнулся с проблемой определения размера сроки в функции. Функция выдаёт мне что размер строки "Hello C++" 3, хотя на самом деле размер 9 символов. Если есть какие-то способы узнать размер строки в функции, прошу подскажите.
Код:
#include "stdafx.h"
#include <iostream>
#include <string.h>

int fun(char t[])
{
	return sizeof(t)-1;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char text[]="Hello C++";
	std::cout<<"Real size = "<<sizeof(text)-1<<'\n';
	std::cout<<"Size from function = "<<fun(text)<<'\n';
	system("pause");
	return 0;
}
kuy вне форума Ответить с цитированием
Старый 12.05.2012, 01:47   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Все правильно выдает.
sizeof(text) = 4 - это РАЗМЕР УКАЗАТЕЛЯ, коим является text
для строк есть strlen и подобные
p51x вне форума Ответить с цитированием
Старый 12.05.2012, 02:02   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2p51x
Цитата:
sizeof(text) = 4 - это РАЗМЕР УКАЗАТЕЛЯ, коим является text
text является статическим массивом, и sizeof(text) будет равен 10.
автор имел в виду входящий параметр char t[] функции foo.

2kuy
массивы в функцию передаются по указателю. следующие записи аналогичны:
Код:
int fun(char *t);
int fun(char t[]);
int fun(char t[10]);
int fun(char t[128]);
поэтому sizeof(t) возвращает размер указателя. если ты передаешь в функцию строку, используй strlen для определения длины. если передаешь просто набор байт, нужно передавать и второй параметр, определяющий размер буфера.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 12.05.2012, 08:35   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Виноват. Описался.... Конечно не text, а t.
p51x вне форума Ответить с цитированием
Старый 12.05.2012, 13:05   #5
kuy
Форумчанин
 
Аватар для kuy
 
Регистрация: 05.09.2011
Сообщений: 109
По умолчанию

С строками разобрался, спасибо, работает.
Ещё один вопрос, можно ли определить размер массива в функции? Есть ли для это функции?
kuy вне форума Ответить с цитированием
Старый 12.05.2012, 13:34   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Обычного сишного массива - нет. В строках узнаванию размера способствует символ конца строки с кодом 0, в массивах такого нет.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 12.05.2012, 13:40   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
int i = 0;
while(str[i] != 0x0) i++;
Ну и дальше по-тексту...
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.05.2012, 14:45   #8
kuy
Форумчанин
 
Аватар для kuy
 
Регистрация: 05.09.2011
Сообщений: 109
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Код:
int i = 0;
while(str[i] != 0x0) i++;
Ну и дальше по-тексту...
В моей проге выдаёт что в массиве 24 элемента; после 9-го непонятные числа. А если в массиве первый элемент 0 (int mas[N] = {0,1,2,3,4,5,6,7,8,9}), тогда выдаёт что 0 элементов в массиве.
Может что не так сделал?
Код:
#include "stdafx.h"
#include <iostream>

void fun(int arr[])
{
int n = 0;
while(arr[n] != 0x0) 
{
		std::cout<<n<<") "<<arr[n]<<'\n';
		n++;
}
std::cout<<"V massive "<<n-1<<" elementov."<<'\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
	const int N=10;
    int mas[N] = {1,1,2,3,4,5,6,7,8,9};
	fun(mas);
	system ("PAUSE");
	return 0;
}
kuy вне форума Ответить с цитированием
Старый 12.05.2012, 14:48   #9
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Обычного сишного массива - нет. В строках узнаванию размера способствует символ конца строки с кодом 0, в массивах такого нет.
Код:
int i = 0;
while(str[i] != 0x0) i++;
Прочитайте и присмотритесь внимательнее.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 12.05.2012, 14:49   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Код:
int i = 0;
while(str[i] != 0x0) i++;
Ну и дальше по-тексту...
С чего вы взяли, что последний элемент в массиве должен быть 0?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Немогу вывести розмер файла..... MARTINS Помощь студентам 0 31.05.2011 22:00
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10