0

文字列からさまざまな数値を抽出する方法を考えていました。strtol が機能することは理解していますが、最初の桁でしか機能しないようです。

これが私のコードです

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
    long v1, v2, v3;
    char str[20] = "16,23";
    char *d;
   v1 = strtol(str, &d, 10);
   v2 = strtol(str, &d, 10);
   printf("string is %s\nv1 is:%i\nv2 is:%d\n",str , v1,v2);
   return 0;
}

この例では、v1 = 16 と v2 = 23 を出力したいと思います。

別の例として、str が「12,23,34」の場合、v3= 34 が必要です

前もって感謝します :)

4

3 に答える 3

2

を使用しlong strtol(const char * nptr, char ** endptr, int base)ます。は、解析が停止した場所であるため、後続のendptr解析を簡単に行うことができます。

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

int string_to_longs(const char *s) {
  #define N 3
  long v[N];
  int i;
  for (i=0; i<N; i++) {
    errno = 0;
    char *end;
    v[i] = strtol(s, &end, 10);

    if (errno) return -1; // overflow
    if (s == end) return -1; // no conversion
    printf("v[%d] = %ld\n", i, v[i]);
    if (*end == 0) break; // we are done
    if (*end != ',') return -1; // missing comma
    s = (const char *) (end + 1);
  }
  return i;
}

int main(void) {
  string_to_longs("16,23");
  string_to_longs("12,23,34");
  return 0;
}
于 2015-10-01T15:53:54.460 に答える
2

たくさんのアプローチができます。それらの 1 つはendptr、前のstrtol()呼び出しによって入力された を次の のソースとして利用することstrtol()です。

それ以外の場合は、より優れた柔軟なアプローチのためにstrtok()、定義済みの区切り文字 (,ここ) を使用してトークンを 1 つずつ取得し、NULL が返されるまで (必要に応じて) intorに変換するオプションもあります。longstrtok()

于 2015-10-01T15:15:47.413 に答える
1

strtol文字配列を long int に変換するだけです。整数を解釈するのに意味をなさない最初の文字が見つかったときに停止します。

string.hには、文字列をトークン化するのに役立つstrtokという名前の関数があります。

strtok元の文字配列の内容を変更することに注意してください。

于 2015-10-01T15:18:29.057 に答える