Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
9 / 9 / 1
Регистрация: 09.07.2009
Сообщений: 636
1

Длина строки (sizeof и strlen)

31.07.2023, 18:08. Показов 1729. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В программе
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main()
{
  setlocale(LC_ALL, "Russian");
  char str1[]   = "Первая строка 1";
  char str2[]   = "Вторая строка 2";
  const int size1   = sizeof(str1)/sizeof(str1[0]);
  const int size2 = sizeof(str2)/sizeof(str2[0]);
  cout << "Количество знаков в строке 1 = " << sizeof(str1)/sizeof(str1[0])  <<  "     strlen = " << strlen(str1) << endl;
  cout << "Количество знаков в строке 2 = " << sizeof(str2) / sizeof(str2[0]) << "     strlen = " << strlen(str2) << endl;
  char str3[size1 + size2 - 1] = "Первая строка 1"; // -1 устраняет из суммы учтенный конец строки для 1 строки, который перезаписывается второй строкой.
  strcat(str3, "Вторая строка 2");
  cout << "Количество знаков в строке sizeof = " << sizeof(str3) / sizeof(str3[0]) << endl;
  cout << "Количество знаков в строке strlen = " << strlen(str3) << endl;
  system("pause");}
получаются разные значения для длины строки при использовании strlen (15 и 30) и sizeof (16 и 31). Правильно я понимаю, что при использовании strlen не учитывается символ конца строки, а при sizeof - учитывается?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2023, 18:08
Ответы с готовыми решениями:

Длина строки в байтах strlen
Всем привет! Прошу помощи. Обновил php до версии 5.6.15 $str = 'привет мир'; $count = strlen($str); var_dump($str); echo...

Длина строки, sizeof, непонятный урок и экономия памяти
Всем снова здравствуйте! y9DwP32LaGc в этом эпизоде происходит нечто не совсем понятное. Автор с начала объявляет переменную с...

длина строки (strlen(name_string) и name_string.size)
Здравствуйте, подскажите пожалуйста, почему функция strlen(name_string) и метод size неправильно определяет длину строки (считает только до...

8
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12860 / 6725 / 1808
Регистрация: 18.10.2014
Сообщений: 17,026
31.07.2023, 18:24 2
Лучший ответ Сообщение было отмечено tumanovalex как решение

Решение

Цитата Сообщение от tumanovalex Посмотреть сообщение
#include <iostream>
using namespace std;
Это язык С?

Цитата Сообщение от tumanovalex Посмотреть сообщение
Правильно я понимаю, что при использовании strlen не учитывается символ конца строки, а при sizeof - учитывается?
sizeof не имеет никакого отношения к длине строки и ничего не знает ни о каких строках вообще. sizeof в данном примере возвращает размер массива. А уж как у вас размер массива коррелирует с длиной строки - это дело десятое. Да, у вас в вашем примере размер массива получается на 1 больше длины строки из-за терминального нуля.

И какой strlen? Для использования strlen нужно #include <cstring>. Я не вижу #include <cstring> у вас в коде.
1
9 / 9 / 1
Регистрация: 09.07.2009
Сообщений: 636
31.07.2023, 18:32  [ТС] 3
Спасибо за ответ. Я теперь понял, что sizeof работает со строкой как с массивом и видимо считает конец строки как элемент массива. Переделывал из проекта C++, забыл убрать. Нужного заголовочного файла у меня действительно нет, но программа работает и strlen считает. Почему считает - не знаю (проверил еще раз только что - работает)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12860 / 6725 / 1808
Регистрация: 18.10.2014
Сообщений: 17,026
31.07.2023, 20:08 4
Цитата Сообщение от tumanovalex Посмотреть сообщение
Я теперь понял, что sizeof работает со строкой как с массивом и видимо считает конец строки как элемент массива.
Ну, еще раз: sizeof не знает, что такое "строка". sizeof не может "считать" конец строки ничем, ибо sizeof ничего не знает ни о каких "концах строк". sizeof возвращает размер объекта в байтах. После объявления char a[100] = "abc"; sizeof a вернет 100, несмотря на то, что длина строки равна 3. Не 3, не 4, а 100.
0
9 / 9 / 1
Регистрация: 09.07.2009
Сообщений: 636
01.08.2023, 09:50  [ТС] 5
Теперь понятно.
0
 Аватар для COKPOWEHEU
4040 / 2585 / 431
Регистрация: 09.09.2017
Сообщений: 11,546
01.08.2023, 11:01 6
А в более общем случае sizeof возвращает размер типа данных. Ему без разницы что строка, что массив, что структура, символ, число иди все это вместе. Это легко проверить:
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(){
  char str1[100] = "12345678901234567890";
  char *str2 = "12345678901234567890";
  printf("str1 = %i\n", sizeof(str1));
  printf("str2 = %i\n", sizeof(str2));
  printf("int = %i\n", sizeof(int));
  printf("char = %i\n", sizeof(char));
  printf("struct (int + char) = %i\n", sizeof(struct{int x; char y;}));
  printf("union (int / char) = %i\n", sizeof(union{int x; char y;}));
}
0
1 / 1 / 0
Регистрация: 01.08.2023
Сообщений: 23
02.08.2023, 15:22 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
#include <cstring>
Это для C++, а у него C, испорченный MSVC, или C++, испорченный незнанием STL.

Добавлено через 1 минуту
sizeof(x) работает во время компиляции, и не знает ничего о массивах с переменным кол-вом элементов.
Нельзя забывать о том, что массив - всего лишь указатель на его первый элемент, и, соответственно, sizeof
развернется в размер указателя на вашей платформе.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12860 / 6725 / 1808
Регистрация: 18.10.2014
Сообщений: 17,026
02.08.2023, 17:52 8
Цитата Сообщение от xiran56 Посмотреть сообщение
sizeof(x) работает во время компиляции, и не знает ничего о массивах с переменным кол-вом элементов.
Это для C++. В языке С sizeof запросто может работать не во время компиляции. Именно потому, что он знает о массивах с переменным кол-вом элементов.

Цитата Сообщение от xiran56 Посмотреть сообщение
Нельзя забывать о том, что массив - всего лишь указатель на его первый элемент, и, соответственно, sizeof
развернется в размер указателя на вашей платформе.
Ни в коем случае. Массив - это массив, а никакой не "указатель на первый элемент". И нельзя забывать о том, что sizeof как раз является общеизвестным хрестоматийным примером одного из трех контекстов, в котором не возникает автоматического преобразования массива к указателю.
0
1 / 1 / 0
Регистрация: 01.08.2023
Сообщений: 23
02.08.2023, 19:08 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В языке С sizeof запросто может работать не во время компиляции.
Да, вы правы:
7 EXAMPLE 3 In this example, the size of a variable length array is computed and returned from a
function:
C Скопировано
1
2
3
4
5
6
#include <stddef.h>
size_t fsize3(int n)
{
char b[n+3]; // variable length array
return sizeof b; // execution time sizeof
}
Взял из ISO C99.

Добавлено через 5 минут
Про массивы извиняюсь, это на меня написание кастомных аллокаторов так подействовало

Добавлено через 14 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это для C++
Ну... Так это и есть C++...

Добавлено через 5 минут
Цитата Сообщение от tumanovalex Посмотреть сообщение
system("pause");
Кстати, замени эту строку на std::cin.get(), и больше нигде и никогда не используй, ведь она работает только на винде
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.08.2023, 19:08
Помогаю со студенческими работами здесь

Даны две переменные, в первой строка, во второй длина строки, 100 - max длина, строки. Что такое dup('$') ?
string db 100 stringlen db ?,100 dup('$')

Строка: Изменить строку так, чтобы длина строки стала равна заданной длине, большей чем текущая длина строки
Добрый вечер! Дана строка, в которой нет начальных и конечных пробелов. Необходимо изменить ее так, чтобы длина строки стала равна заданной...

появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки -
Я видела, что на форуме есть подобные задачи, но ни одно из их решений не работает на моем dev cpp.:( вот вариант решения, но он не...

Удалить среднюю букву, если длина строки нечетная, и две средних, если длина строки четная
Удалить среднюю букву, если длина строки нечетная, и две средних, если длина строки четная

Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf?
Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf?


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Осваиваем Kubernetes: Подробная шпаргалка
Mr. Docker 15.03.2025
Kubernetes — это открытая платформа для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Он был создан для решения проблем, с которыми сталкиваются. . .
Лучшие PHP REST API фреймворки
Jason-Webb 15.03.2025
Современные PHP REST API фреймворки предлагают большой набор функциональности: от автоматической валидации данных и управления маршрутизацией до генерации документации и интеграции с различными. . .
Многопоточность в Java с Project Loom: виртуальные или обычные потоки
Javaican 15.03.2025
Многопоточность всегда была одноим из основных элементов в разработке современного программного обеспечения. Она позволяет приложениям обрабатывать несколько задач одновременно, что критично для. . .
Что нового в Swift 6 и особенности миграции
mobDevWorks 15.03.2025
Swift 6 — это новый крупный релиз языка программирования от Apple, анонсированный на WWDC 2024. Если вы следили за эволюцией Swift, то наверняка заметили, что многие значимые возможности, которые. . .
Вопросы на собеседовании по Android
mobDevWorks 14.03.2025
По данным статистики, Android занимает более 70% мирового рынка мобильных операционных систем, что делает платформу привлекательной как для начинающих разработчиков, так и для опытных профессионалов. . . .
Лучшие игровые движки для Python
py-thonny 14.03.2025
Python обеспечивает разработчиков игр мощными движками и фреймворками, которые позволяют воплотить практически любую идею — от простой аркады до визуального романа с разветвленным сюжетом. Главное. . .
Бессерверный JavaScript: Разработка масштабируемых API с AWS Lambda
run.dev 14.03.2025
Но что такое бессерверные вычисления на самом деле? По сути, это модель облачных вычислений, где разработчик фокусируется исключительно на создании бизнес-логики, не тратя время на настройку. . .
Безопасность кода в C++26: Менеджеры ресурсов и висячие ссылки
NullReferenced 14.03.2025
C++ всегда был языком, предоставляющим разработчикам большие возможности и гибкость, но вместе с тем требующим ответственности. Одной из самых коварных проблем даже для опытных программистов остаются. . .
smart-agent proper interface settings (2025)
jigi33 14.03.2025
Smart-agent proper interface settings (mart 2025). (see screenshots to look at "Etalon" ARM)
Продвинутые настройки JVM
Javaican 14.03.2025
Стандартные параметры запуска JVM хороши для повседневной разработки, но совершенно недостаточны для высоконагруженных систем. Представьте, что вы запускаете финансовую платформу, обрабатывающую. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер