我想创建一个程序,它将以字符串格式读取一些数字并输出如下:如果数字是12345,那么它应输出12 23 34 45。我尝试使用c ++字符串库中的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;
}
答案 0 :(得分:63)
答案 1 :(得分:21)
如here所示,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;
}
答案 2 :(得分:3)
另一个有趣的变体问题可能是:
如果不使用其他字符串,如何将"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 << " ";
}
答案 3 :(得分:2)
您可以使用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;
}
答案 4 :(得分:2)
不使用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++;
}
}
}
答案 5 :(得分:2)
substr(i,j)
表示您从索引i
开始(假设第一个索引为0)并使用下一个j
个字符。
这并不意味着上升到索引j
。
答案 6 :(得分:0)
可能使用string_view的解决方案
void do_it_with_string_view( void )
{
std::string a { "12345" };
for ( std::string_view v { a }; v.size() - 1; v.remove_prefix( 1 ) )
std::cout << v.substr( 0, 2 ) << " ";
std::cout << std::endl;
}
答案 7 :(得分:0)
字符串构造函数可用于获取子字符串的副本。
string(const string& str, size_t pos, size_t n)
例如...
b = string(a, i, 2); // substring of a from position i, including 2 characters
这与 substr
的不同之处在于长度 n 不能省略。我提供这只是作为一种替代,而不是作为一种改进。