Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
MarkOne
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 4
#1

Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int" - C++

10.09.2014, 13:53. Просмотров 2668. Ответов 19
Метки нет (Все метки)

Добрый день!

Я только начинаю изучать язык c++ по книге "Язык программирования С++. Базовый курс 5-е изд 2014(Стэнли Б. Липпман)".

В книге приведен пример кода:
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
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
 
 
using namespace std;
using std::vector;
using std::string;
 
int main(){
 
    vector<string> v;
    string i;
 
    while (getline(cin,i))
    {
        v.push_back(i);
    }
    
    
    for (decltype(v.size()) index = 0; index != v.size() && !isspace(v.at(index)); ++index)
    {
        v.at(index) = toupper(v.at(index));
    }
 
    return 0;
}
но при компиляции выдает ошибки:
Кликните здесь для просмотра всего текста

Ошибка 1 error C2664: "int isspace(int)": невозможно преобразовать аргумент 1 из "std::basic_string<char,std::char_traits<char>,std::allocator<char>>" в "int"
Ошибка 2 error C2664: "int toupper(int)": невозможно преобразовать аргумент 1 из "std::basic_string<char,std::char_traits<char>,std::allocator<char>>" в "int"
3 IntelliSense: не существует подходящей функции преобразования из "std::string" в "int"
4 IntelliSense: не существует подходящей функции преобразования из "std::string" в "int"



2 дня гугления ничего не дали, помогите разобраться в чем проблема
http://www.cyberforum.ru/cpp-beginners/thread1475061.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2014, 13:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int" (C++):

Не существует подходящей функции для преобразования из std::string в LPCTSTR
Ошибка: не существует подходящей функции для преобразования из std::string в...

Ошибка "не найден оператор, принимающий правый операнд типа "const std::string" "
Привет. Подчеркивает Name. Как можно обратиться к public string из класса...

Error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "std::string" (или приемлемое
эмулятор работы банкомата Например #include &quot;stdafx.h&quot; #include...

Ошибка "error C2446: :: нет преобразования "int" в "char *"
Ошибка: &quot;error C2446: :: нет преобразования &quot;int&quot; в &quot;char *&quot; Когда нажимаю...

отсутствует оператор "<<" соответствующий этим операндам (std::ostream << const std::string)
В 20 строке подсвечиваются красным знаки &lt;&lt;. Пишет, что &quot;отсутствует оператор...

19
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
10.09.2014, 14:24 #2
Ошибка у Вас потому, что Вы пытаетесь в качестве аргумента передать в функцию isspace() указатель. А она (и её родственницы) такого не понимает. Согласно своему прототипу она принимает в качестве аргумента тип int. И если char она спокойно приводит к типу int, то вот с указателями такой номер уже не проходит. Поэтому Вам надо строку типа string перевести в строку в стиле C. Воспользуйтесь функцией c_str(). И в качестве аргумента функциям из заголовочного файла <cctype> Вам надо подсовывать тип char (например, элемент сишной строки).
0
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 14:31 #3
isspace в приведенном коде применяется для std::string.
функция c_str() приведет преобразование к char* или const char*, что тоже не очень-то подходит. еще надо пробегаться по строке и анализировать каждый символ. решение какой задачи стоит перед данным кодом? что в книге написано?
0
DiffEreD
1441 / 778 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.09.2014, 14:31 #4
isspace принимает int в качестве аргумента, а не string. Если вызывать, то так:
C++
1
isspace(v.at(index)[0])
0
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 14:45 #5
Согласен с DiffEreD в том случае, если необходимо анализировать первый символ. Но это все-таки вряд ли. Похоже, что необходимо анализировать все символы каждой строки. Для этого понадобится организация дополнительного цикла.
0
MarkOne
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 4
10.09.2014, 15:53  [ТС] #6
Задача звучит так:
Обрабатывать символы, пока они не исчерпаются или не встретиться пробел
0
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 15:54 #7
тогда нужно выносить проверку на пробельные символы из оператора for и в теле цикла организовывать пробег по каждой конкретной строке. можно эту задачу вообще вынести в отдельную функцию..

C++
1
2
3
4
5
6
7
8
9
bool    isSpaceFound(const std::string& str)
{
    int     size = str.size();
    for(int i = 0; i < size; ++i)
        if(isspace(str[i]))
            return  true;
 
    return  false;
}
C++
1
2
3
4
5
    for (decltype(v.size()) index = 0; index != v.size(); ++index)
    {
        if(!isSpaceFound(v.at(index)))        
            v.at(index) = toupper(v.at(index));                [B]// здесь тоже надо пробегаться по всей строке по аналогии с поиском пробельных символов[/B]
    }
0
MarkOne
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 4
10.09.2014, 16:11  [ТС] #8
Цитата Сообщение от mss307 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
bool isSpaceFound(const std::string& str)
{
 int size = str.size();
 for(int i = 0; i < size; ++i)
 if(isspace(str[i]))
 return true;
return false;
}
С isspace я понял

Тогда как быть с функцией
C++
1
toupper(v.at(index));
та же самая ошибка
Кликните здесь для просмотра всего текста
Ошибка 2 error C2664: "int toupper(int)": невозможно преобразовать аргумент 1 из "std::basic_string<char,std::char_traits<char>,std::allocator<char>>" в "int"
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
10.09.2014, 16:36 #9
Цитата Сообщение от MarkOne Посмотреть сообщение
как быть с функцией toupper()
А она из того же заголовочного файла, что и isspace(). Она тоже не принимает в качестве аргумента указатели.
1
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 16:49 #10
C++
1
2
3
4
5
6
void strToUpper(std::string& str)
{
    int     size = str.size();
    for(int i = 0; i < size; ++i)
        toupper(str[i]);
}
Цитата Сообщение от mss307 Посмотреть сообщение
v.at(index) = toupper(v.at(index));
заменить на
C++
1
strToUpper(v.at(index))
как-то так. только проверь. я не компилил.
1
MarkOne
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 4
10.09.2014, 17:07  [ТС] #11
откомпилил без ошибок, но к сожалению строка не меняет регистр.
Может я что то не то вывожу?
C++
1
2
3
4
5
6
for (decltype(v.size()) index = 0; index != v.size(); ++index)
    {
        if (!isSpaceFound(v.at(index)))
            strToUpper(v.at(index));
        cout << v.at(index);
    }
0
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 17:14 #12
метод at(), если мне память не изменяет, возвращает копию объекта. сейчас проверю. Попробуй пока strToUpper(v.[index]);
0
DiffEreD
1441 / 778 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.09.2014, 17:15 #13
Как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
   std::vector<std::string> v{"hello", "hello world", "helloworld abc", "helloworld abc def"};
 
   for(auto& str : v) {
      auto it = std::find(str.begin(), str.end(), ' ');
      std::transform(str.begin(), it, str.begin(), ::toupper);
      std::cout << str << "\n";
   }
 
   return 0;
}
0
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 17:22 #14
C++
1
2
3
4
5
6
7
void strToUpper(std::string& str)
{
    int     size = str.size();
    for(int i = 0; i < size; ++i)
        str[i] = toupper(str[i]);
    std::cout << str;
}
toupper возвращает измененный вариант. я же описание не посмотрел и посчитал, что эта функция ничего не возвращает, изменяя переданный аргумент.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
11.09.2014, 11:52 #15
То же самое в духе стандарта С++11:
C++
1
2
3
4
5
6
7
8
void strToUpper(std::string& str)
{
    for (auto c : str)
    {
        c = toupper(c);
        std::cout << c;
    }
}
Добавлено через 1 час 43 минуты
Цитата Сообщение от MarkOne Посмотреть сообщение
"Язык программирования С++. Базовый курс 5-е изд 2014(Стэнли Б. Липпман)".
Хых, Липпман уже всё до нас придумал (см. стр. 137).

Так что можно ещё красивее:
C++
1
2
3
4
5
6
std::string strToUpper(std::string& str)
{
    for (auto &c : str)
        c = toupper(c);
    return str;
}
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
11.09.2014, 12:22 #16
gru74ik, ваш код работать не будет
0
Renji
2127 / 1486 / 453
Регистрация: 05.06.2014
Сообщений: 4,326
11.09.2014, 12:53 #17
То же самое в духе стандарта С++11:
C++
1
std::transform(str.begin(), str.end(),str.begin(), ::toupper);
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
11.09.2014, 14:23 #18
Цитата Сообщение от S_el Посмотреть сообщение
gru74ik, ваш код работать не будет
Да ладно?
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
/// Вариант 1.
 
#include <iostream>
#include <string>
#include <cctype>
 
void strToUpper(std::string& str);
 
int main()
{
    std::string i = "Don't WORRY be HAPPY.";
    strToUpper(i);
 
    return 0;
}
 
void strToUpper(std::string& str)
{
    for (auto c : str)
    {
        c = toupper(c);
        std::cout << c;
    }
}
http://ideone.com/Hsfck9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// Вариант 2.
 
#include <iostream>
#include <string>
#include <cctype>
 
std::string strToUpper(std::string& str);
 
int main()
{
    std::string i = "Don't WORRY be HAPPY.";
    std::cout << strToUpper(i);
 
    return 0;
}
 
std::string strToUpper(std::string& str)
{
    for (auto &c : str)
        c = toupper(c);
    return str;
}
http://ideone.com/hXysls
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
11.09.2014, 16:45 #19
Цитата Сообщение от gru74ik Посмотреть сообщение
Да ладно?
Виноват,не всмотрелся как следует.
0
aLarman
11.09.2014, 16:50     Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int"
  #20

Не по теме:

Цитата Сообщение от mss307 Посмотреть сообщение
метод at(), если мне память не изменяет, возвращает копию объекта. сейчас проверю
ссылку и если че кидает исключение

0
11.09.2014, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 16:50
Привет! Вот еще темы с ответами:

"range-base for" и проверка на последний элемент в std::set<std::string>
Добрый день. Голова совсем не варит. Как мне организовать простую проверку на...

Ошибка: отсутствует оператор ">>"; типы операндов: std::istream >> std::string
Привет всем! Кто-нибудь объясните пожалуйста, что не так, что от меня...

error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream"
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt;...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить...


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

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

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