Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Jonny_Hacker
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
1

Аналог strncpy и strncmp для типа string

10.11.2014, 22:01. Просмотров 1127. Ответов 6
Метки нет (Все метки)

Подскажите, как проводить операции сравнения и копировании с двумя строками типа string, при чём только над определённым количеством символов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2014, 22:01
Ответы с готовыми решениями:

Напишите варианты библиотечных функций strncpy, strncat и strncmp
вот такая задача, Напишите варианты библиотечных функций strncpy, strncat и...

Присвоение объекту типа string рандомный элемент из массива типа string
Добрый вечер, дорогие форумчане. Я столкнулся с проблемой. Как присвоить...

Аналог trim() для std::string
Не подскажите аналог trim() для std::string в std? Нужно убрать лишние пробелы...

Аналог функции copy из делфи для string в С++
Предположим у нас есть 2 переменные типа string. Как из 1й скопировать часть в...

Есть ли аналог isalpha, только для string
Добрый вечер! Как проверить, что введены только буквы, без символов, isalpha...

6
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,836
10.11.2014, 22:04 2
Jonny_Hacker, assign, compare
Ну и вообще, все есть здесь.
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,226
10.11.2014, 22:35 3
Лучший ответ Сообщение было отмечено Jonny_Hacker как решение

Решение

Функция 'strncpy' не является и никогда не являлась функцией копирования "определённого количества символов" (Распространенные ошибки). Аналога 'strncpy' в 'std::string' нет - в таком виде он просто не нужен.

Выделение подстрок в 'std::string', если это действительно необходимо, можно делать либо со стороны строки-источника (метод 'substr'), либо со стороны строки-приемника (конструктор или метод 'assign').

C++
1
2
3
4
5
std::string src = "Hello World!";
 
std::string dst = src.substr(6, 5); // 'dst' содержит "World"
 
dst.assign(src, 0, 5); // 'dst' содержит "Hello"
1
Jonny_Hacker
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
10.11.2014, 22:38  [ТС] 4
Всё понял, вот програма. Почему то, после ввода строк выбивает ошибку "память не может быть read". Нужно считать строки в вектор words, потом в первую строку вектора letters записываем первые три буквы из первой строки вектора words. После этого при совпадении первых трёх букв последующих строк вектора words с первой строкой letters выводим строку. Что не так то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream.h>
#include <string.h>
#include <windows.h>
#include <vector.h>
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    vector <string> words;
    vector <string> letters;
    string buff;
    cout<<"Введіть слова, для закінчення вводу натисніть два рази Enter"<<endl;
    do 
    {
      getline(cin, buff);
      if (buff.size() > 0)
         words.push_back(buff);
    } while (buff != "");
    
    letters[0].assign(words[0],0,3);
    for(int i=1;i<words.size();i++)
    {
        if(words[i].compare(0,3,letters[0])==0)
            cout<<words[i]<<endl;
    }
    cin.ignore();
    cin.get();
    return 0;
}
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,226
10.11.2014, 22:40 5
Лучший ответ Сообщение было отмечено Jonny_Hacker как решение

Решение

Цитата Сообщение от Jonny_Hacker Посмотреть сообщение
letters[0].assign(words[0],0,3);
Ну так... Вектор 'letters' в этом момент пуст. Поэтому любой доступ к 'letters[0]' - это уже ошибка.

Я не понимаю, почему 'letters' сделан вектором (доступ-то везде только к 'letters[0]'), но раз так, то вместо вышепроцитированного надо бы скорее

C++
1
letters.push_back(words[0].substr(0, 3));
или

C++
1
2
letters.resize(1);
letters[0].assign(words[0],0,3);
1
Jonny_Hacker
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
10.11.2014, 23:09  [ТС] 6
Спасибо вам! Теперь всё ок.
0
Mr.X
Эксперт С++
3182 / 1709 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
10.11.2014, 23:26 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Распространенные ошибки
Очень хороший пример, еще раз подтверждающий, насколько вредно и ненужно изучение Си с его дурацкими функциями.
0
10.11.2014, 23:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2014, 23:26

Аналог метода Split для std::string
Как можно раздилить string? вот например строчка из сишарп string s =...

Есть ли аналог Map <String,String> чтобы передавать его как указатель на данные?
Добрый день, подскажите, есть ли аналог Map &lt;String,String&gt; чтобы передавать...

Аналог break для функции типа void
надо сделать так , на месте break функция ничего не сделала void...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru