char* と null で終わらない文字列の長さを取る strtol に似た標準 C 関数はありますか?
文字列を null で終わる領域にコピーできることはわかっていますが、効率上の理由から、これは望ましくありません。
ありがとう。
標準ライブラリにはそのような関数はありません。一時バッファメソッドを使用するか、独自の関数を最初から作成する必要があります。
あなたの質問に答えるには:いいえ、標準関数はありませんが、独自の関数を書くのは簡単です:
#include <stdio.h>
#include <ctype.h>
int natoi(char *s, int n)
{
int x = 0;
while(isdigit(s[0]) && n--)
{
x = x * 10 + (s[0] - '0');
s++;
}
return x;
}
int main(int argc, char*argv[])
{
int i;
for(i = 1; i < argc; i++)
printf("%d: %d\n", i, natoi(argv[i], 5));
}
strntolはおそらくあなたが求めているものです...しかし、それは標準のCではありません。
効率を求めているのであれば、おそらく自分で書いてデバッグする時間を動機付けることができます。
ただし、コピーを使用してください。おそらく、文字列の長さの上限があるため (a に収まる 10 進数のlong
最大長には厳密な上限があります)、静的バッファーを使用できます。次に、アプリケーション全体をプロファイリングし、コピー/変換が本当にボトルネックになっているかどうかを確認します。もしそうなら、あなたは自分で書く必要があることを知っています。
大まかな(テストされていない、ブラウザで作成された)出発点は次のとおりです。
long limited_strtol(const char *string, size_t len)
{
long sign = 1;
long value = 0;
for(; len > 0 && *string == '-'; string++, len--)
sign *= -1;
for(; len > 0 && isdigit(*string); string++, len--)
{
value *= 10;
value += *string - '0';
len--;
string++;
}
return sign * value;
}