Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/103: Рейтинг темы: голосов - 103, средняя оценка - 4.74
87 / 48 / 24
Регистрация: 29.11.2016
Сообщений: 243

Узнать длину строкового массива

19.12.2016, 20:55. Показов 20178. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++ Скопировано
1
2
3
4
5
6
char s1[27];
cout << strlen(s1) << endl; // Выдаёт 62 вместо 26| Как узнать
char s2[7];//                                     | правильный
cout << strlen(s2) << endl; // Выдаёт 42 вместо 6 | размер
char s3[7] = "12345";
cout << strlen(s2) << endl; // Выдаёт 5 (реальный размер)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2016, 20:55
Ответы с готовыми решениями:

Найти элементы строкового массива имеющие наименьшую длину
Дано текстовый массив А $ (10) .Найти и напечатать элементы наименьшей длины. Вывести на печать данный элемент, его порядковый номер и...

Узнать длину динамического массива
Здравствуйте! В интернете никак не могу найти способ, который бы позволил найти длину динамического массива без использования каких-либо...

Как узнать длину массива
например объявил массив char x, ввел в него gets(x), теперь в массиве строка, но как узнать длину этой строки length(x) не работает

8
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
19.12.2016, 21:05
Torovich, А что у вас в s1 и s2? там мусор. И случайно где-то образовался терминальный ноль
2
87 / 48 / 24
Регистрация: 29.11.2016
Сообщений: 243
19.12.2016, 21:35  [ТС]
Да, там мусор. Изучаю с сайта cppstudio.com Символы и строки.
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    char s2[27] = "Counter-Strike 1.6 forever";          // инициализация строки s2
    char s1[27];// резервируем строку для функции strcpy()
    cout <<"s2 = "<< s2 << endl;
    cout << "strlen(s1) = " << strlen(s1) << endl;
    cout << "strlen(s2) = " << strlen(s2) << endl;
    strcpy_s(s1, strlen(s2)+1, s2); // содержимое строки s2 скопировалось в строку s1, возвращается указатель на s1
    cout << "s1 = " << s1 << endl; // вывод содержимого строки s1
    cout << "strlen(s1) = " << strlen(s1) << endl;
    char s3[7];// резервируем строку для следующей функции
    cout <<"strlen(s3) = "<< strlen(s3)<<endl;
    strncpy_s(s3, 7, s2, 6);     // копируем 7 символов из строки s2 в строку s3
    cout << "s3 = " << s3 << endl; 
    system("pause");
    return 0;
}
В функциях strcpy_s b strncpy нужно вставить размер строки.
В strcpy_s прокатило, т. к. правильно строку выдает.
В strncpy_s - ошибка, т. к. strlen(s3) = 42 вместо 6.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12875 / 6739 / 1810
Регистрация: 18.10.2014
Сообщений: 17,066
19.12.2016, 22:08
Цитата Сообщение от Torovich Посмотреть сообщение
strlen(s1)
Функция strlen преднадзначена для работы с С-строками. Ваш массив, содержащий мусор, строкой не является и применять к нему функцию strlen не разрешается.
1
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
19.12.2016, 22:17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ваш массив, содержащий мусор, строкой не является
А кем же он по вашему является, ежели он char[] ? Он именно и является строкой, содержащей мусор. И как и к любой строке, применение операции strlen является с точки зрения языка совершенно законным. И кем это
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
не разрешается.
? Но конечно, любая операция, примененная к ахинее (мусору) ахинею и дает.
1
87 / 48 / 24
Регистрация: 29.11.2016
Сообщений: 243
19.12.2016, 23:51  [ТС]
Но так я же задал ему размер. char s1[27]. В отладчике показывает размер 27.
Миниатюры
Узнать длину строкового массива  
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12875 / 6739 / 1810
Регистрация: 18.10.2014
Сообщений: 17,066
20.12.2016, 00:06
Лучший ответ Сообщение было отмечено Torovich как решение

Решение

Цитата Сообщение от Байт Посмотреть сообщение
А кем же он по вашему является, ежели он char[] ? Он именно и является строкой, содержащей мусор. И как и к любой строке, применение операции strlen является с точки зрения языка совершенно законным.
Термин "строка" в языке С (и, соотвественно, унаследованный термин "С-строка"/"C-style string" в языке С++) имеет четкое формальное определение, которое дано в разделе 7.1.1 спецификации языка С. Строкой называется непрерывная последовательность символов, завершенная нулевым символом. Нулевой символ при этом считается частью строки.

7.1.1 Definitions of terms
1 A string is a contiguous sequence of characters terminated by and including the first null character.
Если у вас есть некая последовательность символов, для которой не гарантируется завершенность нулевым символом, то такая последовательность символов строкой не является.

Неинициализированный массив char [] строкой не является, по причине того, что не гарантирует завешенность нулевым символом. Применение строковых функций стандартной библиотеки к такому массиву char [] не явлается законным.

Добавлено через 2 минуты
Цитата Сообщение от Torovich Посмотреть сообщение
Но так я же задал ему размер. char s1[27]. В отладчике показывает размер 27.
И что? Функция strlen ничего не знает об этом размере и не имеет вообще никакого отношения к размеру, который вы задали в объявлении символьного массива.
1
87 / 48 / 24
Регистрация: 29.11.2016
Сообщений: 243
20.12.2016, 18:26  [ТС]
Вот так всё получилось...
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    setlocale(LC_ALL, "");
    const int i = 8;
    char s1[i];
    s1[i-1] = '\0';
    cout << s1 << endl;
    cout << strlen(s1) << endl; // То что надо
    char s2[] = "Привет!";
    strcpy_s(s1, strlen(s1)+1, s2);
    cout << s1 << endl;
    system("pause");
    return 0;
}
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
20.12.2016, 18:31
Цитата Сообщение от Torovich Посмотреть сообщение
Но так я же задал ему размер
размер массива и длинна строки - это немного разное, размер массива может быть:
C++ Скопировано
1
2
3
4
char str[100500] = "str";
 
cout << sizeof(str) / sizeof(str[0]); - это размер массива и ровна 100500
cout << strlen(str); - это длинна строки и ровна 4
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2016, 18:31
Помогаю со студенческими работами здесь

Как узнать длину массива?
Функция в качестве параметра получает массив BYTE*. Как узнать его длину?

Как в теле функции узнать длину передаваемого ей массива?
Здравствуйте. Как могу в теле функции узнать длину передаваемого массива (для тела цикла)? Спасибо. #include &quot;stdafx.h&quot; ...

Как узнать длину строки у двумерного динамического массива
Выделаю память для строк столбцов массива так: int n=11; int **mas = new int *; Потом каждому столбцу выделаю разное...

Узнать длину строки и длину каждого слова
есть код который реверсирует слова в строке. Как узнать длину слова(например 3 слова ) и количество символов ? #include...

Как сделать элемент строкового массива элементом числового массива?
Помогите, пожалуйста! :cry: Как поменять элемент строкового массива так, чтобы он стал элементом числового массива? Есть ли в С++ аналог...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
Таблицы лута в Unity с MinMaxCurve и AnimationCurve
GameUnited 12.04.2025
Создание сбалансированного лута в играх — задача не из простых. Разработчики постоянно ищут способы настройки систем выпадения предметов, которые будут одновременно справедливыми для игроков и. . .
std::expected в C++: Управление ошибками
bytestream 12.04.2025
Обработка ошибок всегда была важной и одновременно сложной задачей в программировании на C++. На протяжении долгого времени разработчики использовали различные подходы: возвращаемые коды ошибок,. . .
Nullable типы и операторы объединения null в C#
UnmanagedCoder 12.04.2025
Многие шутят, что null — это миллиардная ошибка в программировании. И в этой шутке только доля шутки. Тони Хоар, создатель null-ссылки, сам назвал её своей "ошибкой на миллиард долларов". Почему?. . .
Аутентификация и авторизация JWT в микросервисах с API Gateway
stackOverflow 12.04.2025
В традиционных монолитных приложениях безопасность часто реализуется как единый защитный периметр - пользователь проходит аутентификацию один раз, после чего получает доступ ко всем функциям системы. . . .
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер