Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

Получить указатель на символ строки string - C++

06.08.2014, 09:54. Просмотров 1324. Ответов 12
Метки нет (Все метки)

надо получить указатель на i-ый символ строки string как это сделать? и еще если у меня будет указатель на i-ый символ строки string как сделать обратную операцию - получить номер этого символа в строке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 09:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить указатель на символ строки string (C++):

Используя указатель на переменную типа string, удалить последний символ этой переменной - C++
есть указатель на переменную string,нужно удалить последний символ этой переменной работая с указателем.Как это осуществить?Заранее...

Описать класс, содержащий длину строки и указатель на его первый символ - C++
Описать класс, содержащий длину строки и указатель на его первый символ. Определить для класса необходимые конструктор (ы), деструктор, а...

Std::string и символ перевода строки - C++
Вот такая простейшая программа: #include <stdio.h> #include <string> using namespace std; int main() { char t="asd\n"; ...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

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

Получить несколько символов строки string - C++
Приветствую. Подскажите, как можно получить несколько символов строки? Вот строка std::string str = &quot;это строка&quot;; И хотелось бы в...

12
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.08.2014, 10:03 #2
GetHelp, Зачем использовать указатели с string?
C++
1
2
3
const std::string s = "hello";
std::string::const_iterator e_pos = s.begin() + 1;
size_t e_idx = e_pos - s.begin();
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
06.08.2014, 10:08  [ТС] #3
ForEveR, а как еще юзать strchr и strtod со string строками? или в плюсах есть им какие то аналоги?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.08.2014, 10:12 #4
GetHelp, Очевидно есть http://en.cppreference.com/w/cpp/string/basic_string
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
06.08.2014, 10:14  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
GetHelp, Очевидно есть http://en.cppreference.com/w/cpp/string/basic_string
зачем мне basic_string если я юзаю обычный string? и о каком конкретно методе речь?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.08.2014, 10:18 #6
GetHelp, Учите матчасть.
C++
1
string
это просто
C++
1
typedef basic_string<char> string;
Если лень разбираться - C строку возвращает метод c_str. Дальше думайте сами, что делать с указателем.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
06.08.2014, 10:22  [ТС] #7
Цитата Сообщение от ForEveR Посмотреть сообщение
GetHelp, Учите матчасть.
да я новичек в плюсах...
Цитата Сообщение от ForEveR Посмотреть сообщение
Если лень разбираться - C строку возвращает метод c_str. Дальше думайте сами, что делать с указателем.
я знаю...

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
3
const std::string s = "hello";
std::string::const_iterator e_pos = s.begin() + 1;
size_t e_idx = e_pos - s.begin();
а можно мне тоже самое только с присвоением типу char*? будет работать?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.08.2014, 10:28 #8
GetHelp,
C++
1
2
3
4
const std::string s = "hello";
const char* s_str = s.c_str();
const char* e_pos = s_str + 1;
const size_t e_idx = e_pos - s_str;
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
06.08.2014, 10:35  [ТС] #9
ForEveR, а если мне очень надо не константный указатель?

Добавлено через 1 минуту
вот смотрите короче, я пишу простой строковый калькулятор и мне надо через strtod сконвертить часть строки в число и получить соответственно символ за числом

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <string.h>
#include <math.h>
 
using namespace std;
 
bool GetSolve(const string& expression, double& result) //Математический интерпретатор
{
    if (expression.empty()) return false; //Если строка пустая - выход
    string tmp(expression); //Копия исходной строки без пробелов
    tmp.erase(remove(tmp.begin(), tmp.end(), ' '), tmp.end()); //Удаляем пробелы в строке
    vector<char> operations; //Стек для операций
    vector<double> numbers; //Стек для чисел
    const char* set_operations = "()^+-*/"; //Операции
    const char* set_numbers = "0123456789."; //Числа
    //Заполняем оба стека
    for (int i = 0; i < tmp.length() - 1; i++)
    {
        if (strchr(set_operations, tmp[i])) //Если символ - операция
            operations.push_back(tmp[i]); //Добавляем в стек
        else
            if (strchr(set_numbers, tmp[i])) //Если символ - цифра
            {
                const char* str = tmp.c_str();
                char* ptr = str + i; //Указатель на текущий символ
                double d = abs(strtod(ptr, &ptr)); //Получаем в d число, а в ptr - укзатель на символ после числа
                numbers.push_back(d); //Заносим число в стек
                i = ptr - tmp.begin(); //Считаем номер символа после числа и прыгаем туда
            }
            else return false; //Если символ не операция и не число - выход
    }   
    //Анализируем стеки
    result = numbers.back();
    return true;
}
 
int main()
{
    string expression;
    double result;
    while (true)
    {
        cout << "Expression: ";
        cin >> expression;
        if (GetSolve(expression, result))
            cout << "Result: " << result << "\n\n";
        else
            cout << "Input error !\n\n";
    }
    return cin.get();
}
з.ы. анализ стеков еще не дописал...
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.08.2014, 10:37 #10
GetHelp, Нельзя неконстантный указатель. Можно снять константность но на свой страх и риск.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
06.08.2014, 10:39 #11
GetHelp, только имей в виду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    std::string s = "hello";
 
    const char* s_str = s.c_str();
    const char* e_pos = s_str + 1;
    const size_t e_idx = e_pos - s_str;
 
    std::cout << *e_pos << std::endl;
 
    s += ", world! i'm cool and crazy!";
 
    const char* i_pos = e_pos + 12;
 
    std::cout << *i_pos << std::endl;  // Oooops!
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.08.2014, 11:38 #12
Цитата Сообщение от GetHelp Посмотреть сообщение
strchr
http://www.cplusplus.com/reference/string/string/find_first_of/

Цитата Сообщение от GetHelp Посмотреть сообщение
strtod
примеров конвертации строки в число на С++ полно и в гугле и на этом форуме
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
06.08.2014, 13:15 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Нельзя неконстантный указатель. Можно снять константность но на свой страх и риск.
В С++11 гарантируетсся непрерывность внутреннего представления std::string. Если нужна ссылка на стандарт, могу привести.
В общем, в С++11 абсолютно легальна вот такая запись (как и для std::vector в С++98 и С++03):
C++
1
2
3
4
5
std::string a = "test";
 
char * p = &a[0];
 
*(p + 2) = 'T'; // заменит s на T
Для более старых версий стандарта вышеприведенный код - UB.

Добавлено через 16 минут
Для интересующихся - подробное объянение.
1
06.08.2014, 13:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2014, 13:15
Привет! Вот еще темы с ответами:

Получить данные из строки string в другие переменные - C++
Здравствуйте. Есть файл, который я считываю построчно в string переменную. Примерный вид строки &quot;1;2;3;4;name;other;other;225;333;222;&quot;...

Вывести строки, в которых символ «*» встречается не менее 2 раз и заменить символ «*» на символ «_» - C++
День добрый. Имеется условие лабы. Написать программу, в которой с клавиатуры вводится до 10 символьных строк. Вывести строки, в...

Каждый символ строки заменить на следующий за ним, а последний символ строки заменяеть первым - C++
я написал код но не могу разобраться. вот дано : ---------------------------------------------------------- В текстовом файле fin.txt...

Найти символ первой строки, который первым не совпал с одним из символов второй строки. Вывести слово, в которое входит этот символ - C++
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с...


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

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

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