atoi () не работает с std :: string :: substr ()

Это фрагмент моего кода:

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h> // atoi()int main() {

std::string line;

std::ifstream numbers("numbertest.txt");

if (numbers.is_open()) {
while (std::getline(numbers, line)) {
for (int i = 0; i < line.length() - 4; i++) {
for (int n = 0; n < 5; n++) {
std::cout << atoi((line.substr(i, 5)[n]).c_str());
}

Я хочу работать с числами в группах по 5, из файла. Почему atoi () не работает здесь? Он говорит «выражение должно иметь тип класса» во вторых скобках в строке atoi.

2

Решение

Пытаться atoi( line.substr(i,5).c_str() )

Или если вы хотите для каждого персонажа

std::cout << ((line.substr(i, 5)[n]) - '0');

Или даже лучше

std::cout << (line[i+n]) - '0');

Обратите внимание, что: atoi является не ASCII в целое число. Он преобразует строку ctype в число. Для одного символа это преобразование должно быть выполнено с использованием арифметической или справочной таблицы.

Также нет смысла преобразовывать символы в целые, а затем печатать их (обратно в главы). Вы должны лучше напечатать сам символ цифры.

Более того, в C ++ я предпочел бы использовать stringstream или atoi. На C ++ 11 есть еще более продвинутые решения, такие как sto *.

1

Другие решения

line.substr(i, 5) создает временную строку std :: string, содержащую 5 символов в line с позиции i

std::string foo = "hello world";
int i = 2;
std::cout << foo.substr(2, 5) << '\n';

напечатал бы «Llo Wo».

[n] Оператор возвращает nый символ подстроки, которая имеет тип charзвонишь .c_str() на что персонаж а не на подстроке.

Вы можете избежать .c_str() полностью с помощью СТД :: стои, например

std::cout << "line.substr(i, 5) = " << line.substr(i, 5) << '\n';
std::cout << std::stoi(line.substr(i, 5));

aoti и stoi принимают строковое представление числа в качестве ввода и возвращают числовое значение. Например:

std::string input = "123a";
// std::cout << input * 10 << '\n'; // illegal: input is a string, not a number.
int i = std::stoi(input); // converts to integer representation, i.e. 123
std::cout << i * 10 << '\n'; // outputs 1230

—— РЕДАКТИРОВАТЬ ——

Вы на самом деле задаете все неправильные вопросы. Что вы хотите сделать, это взять шаблон ввода и вывести все шаблоны из 5 символов в нем.

Пример ввода: «1020304050» Пример вывода: 10203 02030 20304 03040 30405 04050

Вам не нужно конвертировать их в числа, чтобы вывести их, вы можете просто вывести символы. Проблема с вашим исходным кодом заключалась не в преобразовании, а в неправильной последовательности операторов.

std::substring стоит дорого, он должен создать новую временную строку, скопировать в нее символы из оригинала, а затем вернуть его, и он делает это для каждого вызова.

Следующее должно достичь того, что вы пытаетесь сделать:

while (std::getline(numbers, line)) {
for (size_t i = 0; i < line.length() - 4; i++) {
for (size_t n = 0; n < 5; n++) {
std::cout << line[i + n];
}
std::cout << '\n';
}
}

Если вы действительно хотите вызвать substr, вы также можете реализовать это как

while (std::getline(numbers, line)) {
for (size_t i = 0; i < line.length() - 4; i++) {
std::cout << line.substr(i, 5) << '\n';
}
}

Вот рабочая демонстрация: http://ideone.com/mXv2z5

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector