Написать программу определяющую размер строки в битах

Конечно можно циклом посчитать (while (isset($s)). ), но нужен более быстрый способ, т.к. текста много.

acorn

slavon-x86
обычной функцией для подсчета количества символов, что-то вроде strlen() попробуйте, получите значение в байтах (утверждать не могу)

acorn

sax_ol
для строк в utf длина строки определяется функцией mb_strlen(), а функция strlen() должна просто кол-во байт возвращать. попробуйте, не прогадаете

vital

для строк в utf длина строки определяется функцией mb_strlen(), а функция strlen() должна просто кол-во байт возвращать. попробуйте, не прогадаете

не верно=)
Обе функции возращают кол-во _символов в строке_. ПРосто mb_strlen() считает мультибайтовые символы за 1(читаем мануалы). Отсюда вывод, что в приципе, енсли исходить из того, что 1 символ=1байт, то применяя strlen() к _любым_ строкам, мы и будем получать ее длину в байтах.

А вообще.. посчитать кол-во байтбит на пхп в строке.. хм.
Решение в лоб:

Алгоритм переворота строки (String reverse)


Проходим строку посимвольно, каждый элемент проверяя на вхождение в латинский алфаваит, и прочие однобайтные символы входит — сумма+1, не входит — сумма+2.

Получите количество байт. Как в биты перевести самостоятельно сообразите?

Источник: codeby.net

ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу определения длины заданных строк и их распечатки, а также определения размера строк в байтах.

Пример 1. Написать программу определения длины заданных строк и их распечатки, а также определения размера строк в байтах.

Для решения поставленной задачи применим библиотечную функцию strlen() и оператор sizeof.

Программный код решения примера

#include #include #include int main (void) < char str[] = ; char str2[] = «hello, world»; printf(«nt The lines are:nnt «); puts(str); printf(«t «); // Для отступа от края дисплея puts(str2); printf(«nt The length of the 1st line (%c) is: %in», str, strlen(str)); printf(«t The size of the memory of the 1st line (%c) is: %in», str, sizeof str); printf(«nt The length of 2-nd line (%c) is: %in», str2, strlen(str2)); printf(«t Memory size 2-nd line (%c) is: %in», str2, sizeof str2); printf(«n Press any key: «); getch(); return 0; >

В программе использована функция puts(),которая записывает строку, адресуемую, например, параметром str, в стандартное выходное устройство – дисплей.Символ конца строки преобразуется в разделитель строк.

Результат выполнения программы показан на рис. 6.1.

Рис. 6.1. Определение длины и размерности строк

1. В строке str2[] уберите символ завершения строки. Проанализируйте и объясните результат.

Язык C++ с нуля | #33 Найти максимальный и минимальный элемент массива в c++

2. Вместо функций puts() примените функции printf().

3. Задайте явную инициализацию строк как одномерных массивов. Сравните результаты длины и размерности строк.

4. При явной инициализации одномерных массивов в заданных строках не указывайте символы конца строки. Проанализируйте результат выполнения программы.

5. Напишите программу циклического заполнения символьного массива, соответствующего фамилии пользователя (студента).

6. Определите размерности типов char, int, float, double, long int, long double.

Пример 2. Написать программу копирования одной заданной строки в другую.

При решении используем библиотечную функцию strcpy_s(), для которой подключим заголовок ;.

Программный код решения примера

#include #include #include int main (void) < char str1[] = «123456789»; char str2[] = «qwerty»; printf(«nt The length of the line «%c» is: %dn», str1, strlen(str1)); // Копирование с учетом размера str1 strcpy_s(str1, strlen(str1), str2); printf(«t After copying: «); puts(str1); printf(«nt The length of the line «%c» is: %dn», str1, strlen(str1)); printf(«n Press any key: «); getch(); return 0; >

Результат выполнения программы показан на рис. 6.2.

Рис. 6.2. Пример копирования строк

1. В программе для строк добавьте символ окончания строки. Проанализируйте результат выполнения программы.

2. Скопированную строку выведите на экран дисплея с разрядкой (с пробелами) между символами.

3. Произведите копирование одной строки в другую при их задании через клавиатуру.

4. Введите с клавиатуры две строки, различающиеся одним символом. Напишите программу по определению индексов двух различных символов для введенных строк. Длину строк возьмите не менее 7 символов.

5. Произведите копирование одной строки в другую без применения функции strcpy().

6. С клавиатуры введите свою фамилию (буквами латинского алфавита), выведите ее на консоль в прямом и обратном порядке, например Ivanov, vonavI.

Пример 3. Написать программу преобразования десятичной системы счисления в двоичную. Исходное десятичное число считать целым без знака.

Программный код решения примера

#include #include int main (void) < const char D[] = < ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’>; int newNumber[80]; long int inputNumber; int i = 0, base = 2; printf(«nt Enter a positive integer: «); scanf_s(«%c», // Прямой процесс преобразования десятичного числа в двоичное do < newNumber[i] = inputNumber % base; ++i; inputNumber /= base; >if (inputNumber!= 0); //Запись преобразованного числа в обратном порядке printf(«nt Result after conversion: «); for (—i; i >= 0; —i) printf(«%d», newNumber[i]); printf(«nn Press any key: «); getch(); return 0; >
Читайте также:
Сервисное программное обеспечение это антивирусные программы

В программе использован квалификатор (спецификатор) типа const, который указывает компилятору, что символьный массив не может изменяться в программе.

Результат выполнения программы показан на рис. 6.3.

Рис. 6.3. Перевод десятичного числа в двоичное число

1. Проверьте работу программы с помощью инженерного калькулятора (см. calc через Пуск ® Выполнить).

2. Подсчитайте число итераций цикла для преобразования числа 13 в двоичное число.

3. Вместо цикла do – if примените цикл if.

4. Напишите программу преобразования двоичного числа в десятичное число. Проверьте работу программы с помощью инженерного калькулятора.

5. Напишите программу для преобразования десятичных чисел в числа с основанием 3 и 8.

Пример 4. С помощью функции strcat() присоединить одну строку к другой с пробелом и без.

Пусть имеются строки str1 и str2. Функция strcat() присоединяет к строке str1 копию строки str2 и завершает строку str1 нулевым символом [2]. Процесс присоединения называется конкатенацией.

Программный код решения примера

#include #include #include #define N 79 int main (void) < char str1[N+1], str2[N+1]; printf(«nt Print 1 string of characters: «); gets_s(str1, N); // для MS Visual Studio printf(«t Print 2 string of characters: «); gets_s(str2, N); // для MS Visual Studio strcat_s(str1, N, str2); // для MS Visual Studio printf(«nt Result after concatenation: %cn», str1); printf(«n Press any key: «); getch(); return 0; >

Возможный результат выполнения программы представлен на рис. 6.4.

Рис. 6.4. Результат конкатенации двух строк

1. Дополните программу присоединением трех строк, например имени, отчества и фамилии пользователя с учетом необходимых пробелов.

2. Примените посимвольный ввод строк и произведите их конкатенацию с выводом на дисплей ее результата.

3. Произведите конкатенацию имени и фамилии пользователя с помощью операторов цикла, т. е. без помощи функции strcat_s(). Предусмотрите пробел между именем и фамилией.

4. Присоедините к своему имени свою фамилию, записанную в обратном порядке.

Пример 5. Для заданного двухмерного символьного массива сравнить длину строк друг с другом и вывести результат сравнения: 1-я строка меньше или больше 2-й, строки равны между собой.

Для сравнения используем библиотечную функцию strcmp(), которая сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее от результата сравнения [2]. Если первая строка меньше второй, то возвращается значение меньше нуля, если строки равны (по длине), то возвращается нуль, если первая строка больше второй, то возвращается число больше нуля.

Программный код решения примера

#include #include #include // для функции strcmp() #define n 2 #define m 80 int main (void) < int i, x; char str[n][m] = < «hello,», «Hello,» >; printf(«nt Array of strings:n»); for (i = 0; i < n; ++i) printf(«t %d) %cnt (Length: %d)n»,i+1,str[i],strlen(str[i])); printf(«nt Comparision of lines: «); for (i = 0; i < (n — 1); ++i) < x = strcmp(str[i], str[i+1]); printf(«nt Return the function of «strcmp()»: %d», x); if (x == 0) printf(«nt Line %d is equal to %d-nd line.», i+1, i+2); else if (x >0) printf(«nt Line %d is not equal to %d-nd line.», i+1, i+2); else if (x < 0) printf(«nt Line %d is not equal to %d-nd line.», i+1, i+2); >printf(«nn Press any key: «); getch(); return 0; >

Результат выполнения программы показан на рис. 6.5.

Рис. 6.5. Лексикографическое сравнение двух строк

1. Произведите последовательное изменение букв во второй строке: каждую строчную букву замените прописной, записывая при этом оставшиеся буквы строчными. Проанализируйте результат выполнения программы.

2. Протестируйте программу при изменении длины одной из строк, т. е. когда в одной строке нет запятой.

3. Внесите изменения в программу для совпадения двух строк.

4. В символьный массив добавьте еще одну строку. Произведите сравнение между собой всех трех строк массива.

5. Напишите программу по выводу на консоль информации о человеке с помощью пароля, который вводится с клавиатуры. Информация должна содержать имя, фамилию, год, месяц и число рождения, место рождения. В качестве пароля возьмите свою фамилию с учетом регистра (т. е. прописные или строчные буквы).

Пример 6. Написать программу создания символьного трехмерного массива, когда, например, на одной странице имеются три строки и на второй также три строки. Предусмотрите изменение регистра в выводе на экран строк, когда строчные буквы становятся прописными и наоборот.

Читайте также:
Какие из нелитеральных элементов программы защищаются российским законодательством

Для перевода регистра используем библиотечные функции tolower() и toupper() с подключением библиотеки ;.

Программный код решения примера

#include #include #include #include #define n 3 #define m 2 #define N 79 int main (void) < int i, k; // Определение и инициализация символьного массива char str[n][m][N] = < , , >; // Построчный вывод 1-й страницы printf(«nt 1 st page:n»); for (i = 0; i < n; ++i)< printf(«t»); printf(«%cn», str[i]); >// Посимвольный вывод 2-й страницы printf(«nt 2 nd page:n»); for (i = 0; i < n; ++i) < printf(«t»); for (k = 0; k < N; ++k) printf(«%c», toupper(str[i][m-1][k])); // или tolower() >printf(«nn Press any key: «); getch(); return 0; >

В программе используется трехмерный массив размера 3 × 2 × 80. Это означает, что прямоугольная таблица (массив) данных размера 3 × 80 как бы скрепляется 2 раза, например по заданному числу страниц. Следует обратить внимание на вывод страниц. В первом случае используется построчный со спецификатором %c, а во втором – посимвольный со спецификатором %c.

Кроме того, в первом случае к заданному массиву обращение происходит только по одной размерности, а во втором – используются все три размерности массива. Третий размер (число 80) взят для того, чтобы выбранные строки не превышали ширину дисплея.

Результат выполнения программы представлен на рис. 6.6.

Рис. 6.6. Вывод страничных данных трехмерного массива

1. Примените функцию tolower() для перевода в строчные буквы.

2. Для построчного вывода 1-й страницы используйте две размерности заданного массива.

3. В программу добавьте нумерацию строк, например 1), 2), 3).

4. Предусмотрите вывод всей первой страницы, а для второй страницы – только 1-й и 3-й строк.

5. Напишите программу с обработкой трехмерного символьного массива размера 2 × 3 × 80.

6. Сделайте вывод строк с заглавными первыми буквами.

Пример 7. В символьной строке находятся слова и два числа, разделенные пробелами или запятыми. Выделить из строки слова и числа, разместить их в отдельных массивах. При этом считанные числа и слова разместить в дополнительных символьных массивах. Вывести значения сформированных символьных массивов.

Произвести преобразование строковых (символьных) чисел к числам с плавающей точкой (тип double). Если после десятичной точки находится нуль (или нули), то число определить как целое, в противном случае – как число с плавающей точкой.

При решении примера используем библиотечные функции: isalpfa() для определения буквы во входном потоке (с подключением библиотеки ctype.h); isspace() – для определения пробелов во входном потоке (с подключением библиотеки ctype.h); isdigit() – для определения цифры во входном потоке (с подключением библиотеки ctype.h); atof() – для преобразования строки чисел в число с плавающей точкой (с подключением библиотеки stdlib.h); atoi() – для преобразования строки чисел в целое число (с подключением библиотеки stdlib.h); modf() – для выделения целой и дробной части числа (с подключением библиотеки math.h); strlen() – для определения длины строки (с подключением библиотеки string.h) [см.: 3].

Программный код решения примера

#include #include #include #include #include #include #define N 79 int main (void) < double r = 0.0, b3, b4; int i, j, k, m, n, A[N], n2, n3, n4; char str[N], str2[N], str3[N], str4[N]; // Множественная инициализация i = j = k = m = 0; // Обнуление символьных массивов for (n2 = 0; n2 < N; ++n2) str2[n2] = 0; for (n3 = 0; n3 < N; ++n3) str3[n3] = 0; for (n4 = 0; n4 < N; ++n4) str4[n4] = 0; printf(«nt Print line with 2-nd numbers:nt «); gets_s(str, sizeof(str)/sizeof(str[0])); printf(«nt The line is:n»); printf(«t %cn», str); if (str[i]!= ‘’) < if (isalpha(str[i]) || isspace(str[i])) str2[j++] = str[i]; else if (isdigit(str[i]) || str[i] == ‘.’) A[k++] = i; // массив индексов цифр потока else str2[j++] = str[i]; ++i; >printf(«nt A string of words and symbols:nt»); puts(str2); if (k > 0) < n = 0; for (i = 0; i < k; ++i)< if (A[i + 1] — A[i] == 1) str3[n++] = str[A[i]]; else if (A[i+1] — A[i] >1) > > printf(«n»); if (n > 0) < r = modf(atof(str3), if (!r) // если не нуль printf(«t The number is an integer: %d», atoi(str3)); else printf(«t The number is real (double): %lfn», atof(str3)); >if (m > 0) < j = 0; for (i = m; i printf(«nn Press any key: «); getch(); return 0; >

В программе функция modf() возвращает величину дробной части числа (переменная r) и целой части (от переменных b3, b4 взяты их адреса, т. е. b4). Анализ массива с индексами цифр исходного символьного массива дает возможность выделить индексацию двух чисел входного потока. Функция gets_s() автоматически добавляет символ конца строки ‘’, поэтому при объявлении размерности символьного массива следует предусмотреть одно место для ‘’. Для переносимости программ размерность массива в функции gets_s() определена с помощью функции sizeof().

Читайте также:
Программа которая показывает все видео на компьютере

Возможный результат выполнения программы показан на рис. 6.7.

Рис. 6.7. Пример выделения чисел из строки

1. Условие оператора if сделайте короче.

2. Введите свою фамилию (буквами латинского алфавита), год рождения (числом), месяц рождения (словом) и приблизительную массу с точностью до долей килограмма.

3. Вместо переменных и массива типа double примените тип float. Проверьте работоспособность программы.

4. Вместо оператора break примените оператор безусловного перехода goto. Проверьте работоспособность программы.

5. Напишите программу при вводе строки с несколькими словами и одним числом (с десятичной точкой или без нее).

6. Напишите программу при вводе строки с несколькими словами и тремя числами (с десятичной точкой или без нее).

Пример 8. Написать программу, в которой генерируется строка символов заданного размера (более трех) и для которой определяется подстрока из трех символов, вводимая пользователем. В случае, когда подстрока не обнаружена, предусмотреть генерирование случайной строки поиска 1 000 раз, и программа должна искать подстроку до первого совпадения.

Программный код решения примера

В программе случайная генерация букв происходит по их числовым кодам. Интервал чисел определяется между кодами букв ‘a’ и ‘z’.

Возможный положительный результат выполнения программы представлен на рис. 6.8.

Рис. 6.8. Пример определения подстроки в строке

1. Условие нахождения подстроки в строке выполните с помощью оператора goto.

2. В случае положительного поиска подстроки в строке определите количество итераций цикла с предельным значением 1 000.

3. Предусмотрите, чтобы вводимые буквы могли быть и нижнего и верхнего регистров.

4. В программе сделайте ввод с клавиатуры количества циклов формирования строки, в которой следует найти заданную подстроку.

5. Сделайте поиск подстроки в строке, которую сформировали случайно один раз. Если подстрока не будет найдена, предусмотрите ввод количества попыток поиска для генерируемых строк (в 15 символов).

Контрольные вопросы

1. Какой размер одномерного символьного массива должен быть объявлен для записи в него строки из 5 символов?

2. Как организуются многомерные символьные массивы в языке С?

3. Как организуется индексирование символьных массивов в языке С?

4. Как следует объявить символьный массив для записи в него трех строк различной длины?

5. Как следует организовать посимвольное заполнение одномерного массива?

6. Сколько потребуется операторов цикла для вывода на консоль двухмерного символьного массива (строк различной длины)?

7. Какие функции используются для считывания с консоли символьных массивов?

8. Для каких функций включаются в программу заголовочные файлы ctype.h и string.h?

9. Что такое лексиграфическое упорядочивание строк?

Источник: studopedia.info

Определение длинны строки состоящей из char*

Дело вот в чём, при выводе cout
Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
задан 2 июл 2014 в 21:07
Eugene Zubkov Eugene Zubkov
499 3 3 серебряных знака 13 13 бронзовых знаков
3 июл 2014 в 8:40

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Во-первых, не надо такую мешанину из C и C++ городить. Либо C, либо плюсы, гибриды никогда не получаются хоть сколько-нибудь пристойными.

Во-вторых, по коду. Это что такое?

char * binNumber = new char [randomNumber];

У меня нет ни одного подходящего слова чтобы объяснить смысл этого. Длина результирующей строки равна числу, так, что ли? Для записи строкового представления числа 134 в двоичном виде нужны 134 байта? Очевидно, это не так.

Дальше, strlen() может показать не только 22, а ещё и 33, 44, 125, 4387 и вообще что угодно. Потому что память какая-то выделяется (какая — другой вопрос), в неё что-то пишется, а завершающий — забыт.

Но прежде чем этот ноль писать, хорошо бы определиться с размером выделяемой памяти, потому что как сейчас — нельзя.

Если хочется решение на C++, то вот, набросал вариант на скорую руку:

#include #include #include #include using namespace std; static string B) < B.clear(); for( size_t i = 0; a i < sizeof(a)*CHAR_BIT; i++ ) < B += ( (a a >>= 1; > // мы получили строку задом наперёд, переворачиваем reverse(B.begin(), B.end()); if( !B.size() ) B = «0»; // проверку a == 0 можно и в начале сделать return B; > int main()

  1. Сделать функцию dec2bin() шаблоном, чтобы она принимала не только unsigned long (хотя это не так уж и нужно, так, для тренировки)
  2. Если не нужно потом использовать строку именно как строку, можно накапливать единички и нолики в std::vector , вдруг пригодится
  3. .

Ну а если хочется разбираться с памятью, указателями и строками в C, то это совсем другой разговор, о другом.

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru