C++ Поиск слова в строке

689
06 сентября 2017, 14:55

Здравствуйте, есть код определяющий модель чипа видеокарты в данном случае моя карта - это NVIDIA Gefore GTX 970 как мне из модели чипа вытащить только производителя чипа. Было так NVIDIA Gefore GTX 970 должно получиться так NVIDIA, ни один метод из интернета мне не помог.

Вот код:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <regex>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#include <windows.h>
#define _WIN32_DCOM
# pragma comment(lib, "wbemuuid.lib")
int main(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale("rus_rus.866"));
    DISPLAY_DEVICEW dd;
    OSVERSIONINFOEXW osv;
    osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
    GetVersionExW((LPOSVERSIONINFO)&osv);
    dd.cb = sizeof(DISPLAY_DEVICEW);
    EnumDisplayDevicesW(NULL, 0, &dd, EDD_GET_DEVICE_INTERFACE_NAME);

    wcout << L"video: " << dd.DeviceString << endl;
    wcout << endl;
    system("pause");
    return 0;
}
Answer 1

Если вам не известно правило по которому можно вычленить имя производителя из названия видеокарты, то можно сделать так.

Напишем функтор для проверки есть ли в строке подстрока:

struct Contains{
    std::string str;
    explicit Contains(const std::string &str):
        str(str)
    {}
    bool operator()(const std::string &substr) const{
        return std::search(str.begin(), str.end(), substr.begin(), substr.end()) != str.end();
    }
};

Теперь можно попробовать найти в заданной строке одно из известных нам названий:

std::string company(const std::string &name){
    typedef std::vector<std::string> Companies;
    typedef Companies::const_iterator Company;
    static const Companies companies = {
        "RADEON",
        "NVIDIA",
        "OTHER"
    };
    Company company = std::find_if(companies.begin(), companies.end(), Contains(name));
    if(company == companies.end()){
        return "unknown";
    }
    return *company;
}

Полный пример

Answer 2

Ну если предполагается, что первое слово в полном названии - это производитель чипа, то можно, например, так.

string Device = "NVIDIA Gefore GTX 970";
cout << Device.substr(0, Device.find(' '));
Answer 3

Можно попробовать один костыльный способ: просто вырезать все до первого пробела.

READ ALSO
Динамические структуры в c++

Динамические структуры в c++

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

308
Error C2075 при инициализации массива

Error C2075 при инициализации массива

Вы пытаетесь захватить info по значению, а так нельзя - это массивЗахватывайте по ссылке - &info

261
Конвертация YAW PITCH ROLL в траекторию для UE4

Конвертация YAW PITCH ROLL в траекторию для UE4

У меня есть массив данных (YPR) снятый с показаний гироскопа при его движении по определенной траектории (примерно по 100 значений на секунду)Я...

256