#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int main(int argc, const char * argv[]) {
setlocale(LC_CTYPE, "rus");
int f = 0; // f - это количство пробелов в слове
int s = 10; // s - это количество букв в слове (изначально 10)
char tt[10];
cin >> tt;
cout << endl;
for (int i = 0; i < 10; i++) {
if (tt[i] == ' ') f++;
}
s = s - f;
cout << s << endl;
cin.get();
return 0;
}
Здравствуйте, у меня такая проблема. Мне нужно узнать число букв в массиве. Я пытался сначала найти число пробелов после слова, а потом вычесть его из количества символом максимально возможного массива. У меня выходит число пробелов = 0. Как сделать так, что бы выводило число букв в массиве?
Проблема усложняется тем, что строка может содержать символы unicode. буквы кириллицы, например. Чтобы их подсчитать, нужно определить длину символа по первому байту.
#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace std;
// Определяем длину символа UTF-8
int u8_char_len(char first_byte) {
unsigned short int bytes = 0;
if ((first_byte & 0xC0) == 0xC0) {
if ((first_byte & 0xF0) == 0xF0) bytes = 4;
else if ((first_byte & 0xE0) == 0xE0) bytes = 3;
else bytes = 2;
} else bytes = 1;
return bytes;
}
// Определяем длину строки UTF-8
int u8_str_len(char * str) {
int i = 0, count = 0;
for (; str[i] != '\0'; i += u8_char_len(str[i]))
if (str[i] != ' ')
count++;
return count;
}
int main()
{
setlocale(LC_CTYPE, "rus");
char tt[10];
cin.getline(tt, 10);
int symbols_count = u8_str_len(tt);
cout << symbols_count << endl;
cin.get();
return 0;
}
Считывание через >>
в массив символов (да и в std::string
тоже) идет до первого пробела.
Если вам нужна вся строка (со всеми пробелами, до символа переноса строки), используйте std::getline
(и заодно замените массив символов на более удобный std::string
):
std::string tt;
std::getline(std::cin, tt);
Кроме того, чтобы не считать символы вручную, можно использовать std::count
и std::count_if
:
число_пробелов = std::count(tt.begin(), tt.end(), ' ');
число_букв = std::count_if(tt.begin(), tt.end(), [](unsigned char c){return std::isalpha(c);});
Еще, пробелы можно считать через:
число_пробелов = std::count_if(tt.begin(), tt.end(), [](unsigned char c){return std::isspace(c);});
Тогда будут подсчитаны все "пробельные символы", куда кроме пробела входит табуляция и еще кое-что.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь собрать пример скриншота на GDI+ на С++ через clexe Вот пример который я пытаюсь собрать