11

char* と null で終わらない文字列の長さを取る strtol に似た標準 C 関数はありますか?

文字列を null で終わる領域にコピーできることはわかっていますが、効率上の理由から、これは望ましくありません。

ありがとう。

4

4 に答える 4

4

標準ライブラリにはそのような関数はありません。一時バッファメソッドを使用するか、独自の関数を最初から作成する必要があります。

于 2009-07-06T08:42:58.967 に答える
3

あなたの質問に答えるには:いいえ、標準関数はありませんが、独自の関数を書くのは簡単です:

#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));
}
于 2009-07-06T08:48:40.733 に答える
2

strntolはおそらくあなたが求めているものです...しかし、それは標準のCではありません。

于 2009-07-06T08:42:35.550 に答える
1

効率を求めているのであれば、おそらく自分で書いてデバッグする時間を動機付けることができます。

ただし、コピーを使用してください。おそらく、文字列の長さの上限があるため (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;
}
于 2009-07-06T08:48:24.837 に答える