在Java中,字符串具有charAt()
函数。
在C ++中,该函数只是stringname[INDEX]
但是,如果我想在整数的某个索引处使用特定数字呢?
E.g。
int value = 9123;
假设我想使用索引0,这只是9。
有没有办法在整数中使用索引?
答案 0 :(得分:14)
int value = 9123;
std::stringstream tmp;
tmp << value;
char digit = (tmp.str())[0];
答案 1 :(得分:8)
不,没有标准函数从整数中提取十进制数字。
在C ++ 11中,有一个转换为字符串的函数:
std::string string = std::to_string(value);
如果你不能使用C ++ 11,那么你可以使用字符串流:
std::ostringstream stream;
stream << value;
std::string string = stream.str();
或旧式C格式:
char buffer[32]; // Make sure it's large enough
snprintf(buffer, sizeof buffer, "%d", value);
std::string string = buffer;
或者如果你只想要一个数字,你可以算术地提取它:
int digits = 0;
for (int temp = value; temp != 0; temp /= 10) {
++digits;
}
// This could be replaced by "value /= std::pow(10, digits-index-1)"
// if you don't mind using floating-point arithmetic.
for (int i = digits-index-1; i > 0; --i) {
value /= 10;
}
int digit = value % 10;
以合理的方式处理负数仍然是读者的练习。
答案 2 :(得分:6)
您可以使用以下公式(伪代码):
currDigit = (absolute(value) / 10^index) modulo 10; // (where ^ is power-of)
答案 3 :(得分:1)
为了完成任务,您还可以使用 boost :: lexical_cast ,有关详细信息,请查看文档here。
基本上它只是代码的一个很好的包装,可以在 Andreas Brinck answear找到。
答案 4 :(得分:1)
另一个解决方案,它使用0表示最可靠的数字。 digits
用于按行写顺序将value
细分为单个数字。 (即“9347”变为9,3,4,7)。然后我们丢弃第一个index
值。即为了得到第3位数字,我们丢弃前两位并占据新的前线。
if (value==0 && index ==0) return 0; // Special case.
if (value <0) { ... } // Unclear what to do with this.
std::list<char> digits;
while (value) {
digits.push_front(value % 10);
value /= 10;
}
for(; index > 0 && !digits.empty(); index--) {
digits.pop_front();
}
if (!digits.empty()) {
return digits.front();
} else
{
throw std::invalid_argument("Index too large");
}
答案 5 :(得分:0)
答案 6 :(得分:0)
尝试使用sprintf将整数写入字符串:
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
然后你可以索引你刚刚打印到的char数组。
答案 7 :(得分:0)
更长版本尊重Andreas Brink。
C ++库的设计使得“序列”和“值”之间存在一个名为“流”的“中介”,它实际上充当了从值到尊重序列的翻译。
“sequences”是一个抽象概念,其具体实现是“字符串”和“文件”。 “stream”是另一个抽象概念,其对应的具体实现是“stringstream”和“fstream”,它们是在辅助类“stringbuf”和“filebuf”(都是从抽象“streambuf”派生)和辅助对象中实现的。 “locale”类,包含一些“facet”。
引用的答案代码以这种方式运作:
tmp
的{{1}}对象是默认构造的:这将在内部构建stringstream
和stingbuf
,以及string
引用系统全局区域设置的方面(默认重新映射“经典”或“C”区域设置)locale
函数之间的operator<<
:其中一个函数用于所有基本类型int
facet,从缓冲区获取“buffer iterator”,并调用num_put
函数传递给定流的格式标志。put
函数时,缓冲区内容被“发送”(在本例中为copy)到字符串,以及字符串内容返回。这个非常复杂的过程起初看起来很复杂,但是:
答案 8 :(得分:0)
我已经实现了giorashc解决方案的变体,解决了所有建议的修复和问题:它有点长但是如果所有内联都应该很快:大部分代码都是我留下的测试完整性。
#include <iostream>
#include <math.h>
char get_kth_digit( int v, int index)
{
assert(v>0);
int mask = pow(10,index);
return '0'+(v % (mask*10))/mask;
}
int count_digits( int v )
{
assert(v>0);
int c=0;
while(v>0)
{
++c;
v/=10;
}
return c;
}
char get_int_index(int v, int index)
{
if( v==0 ) return '0';
if( v < 0 )
{
if(index==0) { return '-'; }
return get_int_index(-v,index-1);
}
// get_kth_digit counts the wrong way, so we need to reverse the count
int digits = count_digits(v);
return get_kth_digit( v, digits-index-1);
}
template<typename X, typename Y>
void compare(const X & v1, const Y & v2, const char * v1t, const char * v2t, uint32_t line, const char * fname )
{
if(v1!=v2)
{
std::cerr<<fname<<":"<<line<<": Equality test failed "<< v1t << "("<<v1<<") <> " << v2t <<" ("<<v2<<")"<<std::endl;
}
}
#define test_eq(X,Y) compare(X,Y,#X,#Y,__LINE__,__FILE__)
int main()
{
test_eq( 1, count_digits(1) );
test_eq( 1, count_digits(9) );
test_eq( 2, count_digits(10) );
test_eq( 2, count_digits(99) );
test_eq( 3, count_digits(100) );
test_eq( 3, count_digits(999) );
test_eq( '1', get_kth_digit(123,2) );
test_eq( '2', get_kth_digit(123,1) );
test_eq( '3', get_kth_digit(123,0) );
test_eq( '0', get_kth_digit(10,0) );
test_eq( '1', get_kth_digit(10,1) );
test_eq( '1', get_int_index(123,0) );
test_eq( '2', get_int_index(123,1) );
test_eq( '3', get_int_index(123,2) );
test_eq( '-', get_int_index(-123,0) );
test_eq( '1', get_int_index(-123,1) );
test_eq( '2', get_int_index(-123,2) );
test_eq( '3', get_int_index(-123,3) );
}
答案 9 :(得分:0)
我会将其转换为字符串,然后对其进行索引-CPP也具有:
str.at(i)
类似于Java的功能。
C ++ 11中另一个更简单的循环是基于范围的循环-
int i = 0
for(auto s : int_or_str){
if(i == idx)
cout << s;
else
i++
}
我想这并不比标准的for loop更容易-认为auto可能会有所帮助,但并非如此。我知道这是答案,但我更喜欢简单且熟悉的答案。
扎克