我正在创建一个程序,它从一个由a-z和数字0组成的文件中读取序列中的大量字符。示例如下所示:
a0dgiw00cffn0ai0cbiwa0...
我相信我将此序列转换为字符数组:
strncpy(array, string.c_str(), sizeof(array));
现在我有一个看起来像这样的数组:
[a][0][d][g][i][w][0][0]...
所以我的问题是,将字符数组中的所有值转换为ASCII键值的最有效方法是什么?尽可能在最短的时间内效率最高。如果您不理解“ASCII键值”的含义,最终数组应如下所示:
[97][48][100][103][105][119][48][48]...
旁注:可以找到一个ASCII键值表here。
Side注意:我已经知道如何将数组值转换为ASCII,我只是在寻找一种更快的方法。
提前谢谢。
答案 0 :(得分:2)
假设有很多关于您的语言环境的内容,它已经存储为ASCII字符"在引擎盖下",如在' a' == 97二进制文件中char(或编译器/系统使用的任何内容)。让你的系统对待' a'作为整数值而不是字符,您只需要(int)'a'
,字符串的任何部分都需要(int)array[index]
。
#include <iostream>
#include <string>
int main() {
using namespace std;
string sample = "abcdefghijklmnopqrstuvwxyz";
for(char c : sample) {
// NOTE: cast to (int) doesn't change value of 'c'.
cout << c << '=' << (int)c << endl;
}
return 0;
}
输出:
a=97
b=98
c=99
d=100
e=101
f=102
g=103
h=104
i=105
j=106
k=107
l=108
m=109
n=110
o=111
p=112
q=113
r=114
s=115
t=116
u=117
v=118
w=119
x=120
y=121
z=122
答案 1 :(得分:0)
对于初学者来说,如果你正在寻找效率,那么数组的初始strncpy()
绝对没有任何结果。我不知道它给你带来了什么。 string.c_str()
为您提供与数组相同的const char *
。保持一切就绪,避免不必要的复制开销。
然后,如果您正在寻找将char
值转换为十进制的最有效方法,那么手动操作将很难被击败。
unsigned char c= /* wherever you get the next char from */
int zero=0;
if (c >= 100)
{
zero=1;
*ptr++ = (c/100) + '0';
c = c % 100;
}
if (c >= 10 || zero)
{
*ptr++ = (c / 10) + '0';
}
*ptr++ = (c % 10) + '0';
这应该轻松击败std::ostream
所做的事情,因为它不必担心std::ostream
输出格式必须要做的所有行李。
现在,如果原始string
长度为n=size()
个字节,则转换为十进制表示的整个事物的最长可能大小为每个值三个字符,或n*3
。然后,考虑到括号,它是另外两个,总计为n*5
。
所以:
std::vector<char> output_buffer;
output_buffer.resize(string.size()*5);
auto ptr=&output_buffer[0];
for (unsigned char c:string)
{
// the code segment above, with a few extra bits to append
// the [ and the ], in the right place.
}
完成后,ptr-&output_buffer[0]
会为您提供实际写入的字符数。您可以修剪缓冲区,或将其复制到您自己的std::string
中。