Как определить число букв в массиве?

134
30 октября 2019, 20:20
#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. Как сделать так, что бы выводило число букв в массиве?

Answer 1

Проблема усложняется тем, что строка может содержать символы 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;
}
Answer 2

Считывание через >> в массив символов (да и в 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);});

Тогда будут подсчитаны все "пробельные символы", куда кроме пробела входит табуляция и еще кое-что.

READ ALSO
Класс String. Перегрузка операторов

Класс String. Перегрузка операторов

Помогите найти ошибку в коде

151
Не компилируется GDI+ через cl.exe

Не компилируется GDI+ через cl.exe

Пытаюсь собрать пример скриншота на GDI+ на С++ через clexe Вот пример который я пытаюсь собрать

148
Результат a += a++

Результат a += a++

Почему после выполнения такого кода

156