Ответ 1
Если я прав, второй параметр substr()
должен быть длиной подстроки. Как насчет
b = a.substr(i,2);
?
Я хочу создать программу, которая будет читать некоторое число в строковом формате и выводить его следующим образом: если число равно 12345, оно должно вывести 12 23 34 45. Я попытался использовать функцию substr() из строковой библиотеки С++, но это дает мне странные результаты - он выводит 1 23 345 45 вместо ожидаемого результата. Почему?
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(void)
{
string a;
cin >> a;
string b;
int c;
for(int i=0;i<a.size()-1;++i)
{
b = a.substr(i,i+1);
c = atoi(b.c_str());
cout << c << " ";
}
cout << endl;
return 0;
}
Если я прав, второй параметр substr()
должен быть длиной подстроки. Как насчет
b = a.substr(i,2);
?
Как показано здесь, второй аргумент substr
- это длина, а не конечная позиция:
string substr ( size_t pos = 0, size_t n = npos ) const;
Создать подстроку
Возвращает строковый объект с его содержимым, инициализированным подстрокой текущего объекта. Эта подстрока представляет собой последовательность символов, которая начинается с символьной позиции
pos
и имеет длину символовn
.
Ваша строка b = a.substr(i,i+1);
будет генерировать для значений i
:
substr(0,1) = 1
substr(1,2) = 23
substr(2,3) = 345
substr(3,4) = 45 (since your string stops there).
Вам нужно b = a.substr(i,2);
Вы также должны знать, что ваш результат будет выглядеть забавным для числа, такого как 12045. Вы получите 12 20 4 45
из-за того, что используете atoi()
в разделе строки и выставляете это целое число. Возможно, вам захочется попробовать только вывод самой строки, длина которой будет двух символов:
b = a.substr(i,2);
cout << b << " ";
На самом деле все это можно было бы просто написать следующим образом:
#include <iostream>
#include <string>
using namespace std;
int main(void) {
string a;
cin >> a;
for (int i = 0; i < a.size() - 1; i++)
cout << a.substr(i,2) << " ";
cout << endl;
return 0;
}
Еще один интересный вариант вопроса:
Как бы вы сделали "12345"
как "12 23 34 45"
без использования другой строки?
Будет ли следовать?
for(int i=0; i < a.size()-1; ++i)
{
//b = a.substr(i, 2);
c = atoi((a.substr(i, 2)).c_str());
cout << c << " ";
}
Вы можете получить вышеуказанный вывод, используя следующий код в c
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
char *str;
clrscr();
printf("\n Enter the string");
gets(str);
for(int i=0;i<strlen(str)-1;i++)
{
for(int j=i;j<=i+1;j++)
printf("%c",str[j]);
printf("\t");
}
getch();
return 0;
}
Возможное решение без использования substr()
#include<iostream>
#include<string>
using namespace std;
int main() {
string c="12345";
int p=0;
for(int i=0;i<c.length();i++) {
cout<<c[i];
p++;
if (p % 2 == 0 && i != c.length()-1) {
cout<<" "<<c[i];
p++;
}
}
}
substr(i,j)
означает, что вы начинаете с индекса i
(считая первый индекс равным 0) и принимаете следующие символы j
.
Это не значит подходить к индексу j
.