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

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

10.09.2014, 13:53. Показов 5866. Ответов 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::allocato r<char>>" в "int"
Ошибка 2 error C2664: "int toupper(int)": невозможно преобразовать аргумент 1 из "std::basic_string<char,std::char_traits<char>,std::allocato r<char>>" в "int"
3 IntelliSense: не существует подходящей функции преобразования из "std::string" в "int"
4 IntelliSense: не существует подходящей функции преобразования из "std::string" в "int"



2 дня гугления ничего не дали, помогите разобраться в чем проблема
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 13:53
Ответы с готовыми решениями:

Не существует подходящей функции преобразования из "std::string" в "int"
Я только начинаю изучать язык c++ по книге &quot;Язык программирования С++. Базовый курс 5-е изд...

Error c2440 "невозможно преобразовать "std::string" в "std::string *" "
class file { public: string file_name; ... } int main() { file File, *r; r...

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

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

19
Эксперт CЭксперт С++
5063 / 2250 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
10.09.2014, 14:24 2
Ошибка у Вас потому, что Вы пытаетесь в качестве аргумента передать в функцию isspace() указатель. А она (и её родственницы) такого не понимает. Согласно своему прототипу она принимает в качестве аргумента тип int. И если char она спокойно приводит к типу int, то вот с указателями такой номер уже не проходит. Поэтому Вам надо строку типа string перевести в строку в стиле C. Воспользуйтесь функцией c_str(). И в качестве аргумента функциям из заголовочного файла <cctype> Вам надо подсовывать тип char (например, элемент сишной строки).
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 14:31 3
isspace в приведенном коде применяется для std::string.
функция c_str() приведет преобразование к char* или const char*, что тоже не очень-то подходит. еще надо пробегаться по строке и анализировать каждый символ. решение какой задачи стоит перед данным кодом? что в книге написано?
0
1453 / 790 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.09.2014, 14:31 4
isspace принимает int в качестве аргумента, а не string. Если вызывать, то так:
C++
1
isspace(v.at(index)[0])
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 14:45 5
Согласен с DiffEreD в том случае, если необходимо анализировать первый символ. Но это все-таки вряд ли. Похоже, что необходимо анализировать все символы каждой строки. Для этого понадобится организация дополнительного цикла.
0
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 4
10.09.2014, 15:53  [ТС] 6
Задача звучит так:
Обрабатывать символы, пока они не исчерпаются или не встретиться пробел
0
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
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::allocato r<char>>" в "int"
0
Эксперт CЭксперт С++
5063 / 2250 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
10.09.2014, 16:36 9
Цитата Сообщение от MarkOne Посмотреть сообщение
как быть с функцией toupper()
А она из того же заголовочного файла, что и isspace(). Она тоже не принимает в качестве аргумента указатели.
1
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
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
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
10.09.2014, 17:14 12
метод at(), если мне память не изменяет, возвращает копию объекта. сейчас проверю. Попробуй пока strToUpper(v.[index]);
0
1453 / 790 / 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
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
Эксперт CЭксперт С++
5063 / 2250 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
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
2415 / 1815 / 400
Регистрация: 15.12.2013
Сообщений: 7,859
11.09.2014, 12:22 16
gru74ik, ваш код работать не будет
0
2718 / 1883 / 558
Регистрация: 05.06.2014
Сообщений: 5,489
11.09.2014, 12:53 17
То же самое в духе стандарта С++11:
C++
1
std::transform(str.begin(), str.end(),str.begin(), ::toupper);
0
Эксперт CЭксперт С++
5063 / 2250 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
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
2415 / 1815 / 400
Регистрация: 15.12.2013
Сообщений: 7,859
11.09.2014, 16:45 19
Цитата Сообщение от gru74ik Посмотреть сообщение
Да ладно?
Виноват,не всмотрелся как следует.
0
aLarman
11.09.2014, 16:50     Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int"
  #20

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2014, 16:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Калькулятор для работы с знаками "+" "-" "/" "*" через string без приоритетов
Нужно написать калькулятор для работы с знаками &quot;+&quot; &quot;-&quot; &quot;/&quot; &quot;*&quot; через string. Приоритеты действий...

Не существует подходящей функции преобразования из "std::string" в "System::String ^"
Имею массив типа string и хочу перенести текст из него в переменную String^ для дальнейшего...

Как исправить ошибку 'Не удается неявно преобразовать тип "System.Collections.Generic.IEnumerable<string>" в "string"'?
Не удается неявно преобразовать тип &quot;System.Collections.Generic.IEnumerable&lt;string&gt;&quot; в &quot;string&quot;. ...


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

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

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