<p>你真的需要为所有这些<code>long</code>关闭空间吗?在</p>
<p>我不熟悉Python/capi,所以这可能是一个糟糕的建议,但是您不能在字符串上迭代并在执行时将找到的每个long追加到列表中吗?在</p>
<p>也就是说,取这个代码:</p>
<pre><code>static const char* const testString = "12 345 67 8 910 11 1213 141516, 1718";
int main()
{
const char* i = testString;
long parseLong = 0;
int gotLong = 0;
for (;*i;++i)
{
if ('0' <= *i && *i <= '9')
{
parseLong = (parseLong * 10) + (*i - '0');
gotLong = 1;
}
else if (gotLong)
{
printf("Got: %d\n", parseLong);
parseLong = 0;
gotLong = 0;
}
}
if (gotLong)
printf("Got: %d\n", parseLong);
}
</code></pre>
<p>然后将<code>printf</code>替换为一些合适的Python善性,比如<code>PyList_Append()</code>。在</p>
<p>除了避免<code>malloc</code>,使用更少的内存,并且能够安全地直接对常量Python字符串进行操作,此代码还可以处理诸如空字符串、多个空格和数字之间的其他分隔符之类的转角情况。在</p>
<p/><hr/>
<strong>编辑:计算多头数</strong>
如果您想先计算long的数量,这样就可以分配正确长度的Python List,那么您只需添加如下内容:
^{pr2}$
<p>应该比较快。
</p><hr/>
<strong>编辑2:更好的解析器</strong><br/>
上面的解析器有一个稍微好一点的版本,它更紧凑,不需要<code>gotLong</code>,也不必重复代码来处理最后的long:
<pre><code> for (i = testString;*i;++i)
{
if (isdigit(*i))
{
do {
parseLong = (parseLong * 10) + (*i - '0');
} while (*++i && isdigit(*i));
printf("Got: %d\n", parseLong);
parseLong = 0;
}
}
</code></pre>